@cyberskill/shared 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/commitlint/index.js +1 -0
- package/dist/config/commitlint/index.js.map +1 -0
- package/dist/config/config.test.unit.d.ts +1 -0
- package/dist/config/config.type.js +1 -0
- package/dist/config/config.type.js.map +1 -0
- package/dist/config/config.type.test.unit.d.ts +1 -0
- package/dist/config/config.util.js +1 -0
- package/dist/config/config.util.js.map +1 -0
- package/dist/config/env/env.constant.js +1 -0
- package/dist/config/env/env.constant.js.map +1 -0
- package/dist/config/env/env.util.js +1 -0
- package/dist/config/env/env.util.js.map +1 -0
- package/dist/config/env/index.js +1 -0
- package/dist/config/env/index.js.map +1 -0
- package/dist/config/eslint/index.js +1 -0
- package/dist/config/eslint/index.js.map +1 -0
- package/dist/config/graphql-codegen/graphql-codegen.util.js +1 -0
- package/dist/config/graphql-codegen/graphql-codegen.util.js.map +1 -0
- package/dist/config/graphql-codegen/index.js +1 -0
- package/dist/config/graphql-codegen/index.js.map +1 -0
- package/dist/config/index.js +1 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/lint-staged/index.js +1 -0
- package/dist/config/lint-staged/index.js.map +1 -0
- package/dist/config/storybook/index.js +1 -0
- package/dist/config/storybook/index.js.map +1 -0
- package/dist/config/storybook/storybook.main.js +1 -0
- package/dist/config/storybook/storybook.main.js.map +1 -0
- package/dist/config/storybook/storybook.preview.js +1 -0
- package/dist/config/storybook/storybook.preview.js.map +1 -0
- package/dist/config/vitest/index.js +1 -0
- package/dist/config/vitest/index.js.map +1 -0
- package/dist/config/vitest/vitest.e2e.js +1 -0
- package/dist/config/vitest/vitest.e2e.js.map +1 -0
- package/dist/config/vitest/vitest.unit.js +1 -0
- package/dist/config/vitest/vitest.unit.js.map +1 -0
- package/dist/constant/common.js +1 -0
- package/dist/constant/common.js.map +1 -0
- package/dist/constant/constant.test.unit.d.ts +1 -0
- package/dist/constant/index.js +1 -0
- package/dist/constant/index.js.map +1 -0
- package/dist/constant/response-status.js +1 -0
- package/dist/constant/response-status.js.map +1 -0
- package/dist/node/apollo-server/apollo-server.util.js +1 -0
- package/dist/node/apollo-server/apollo-server.util.js.map +1 -0
- package/dist/node/apollo-server/index.js +1 -0
- package/dist/node/apollo-server/index.js.map +1 -0
- package/dist/node/cli/index.js +1 -0
- package/dist/node/cli/index.js.map +1 -0
- package/dist/node/command/command.test.unit.d.ts +1 -0
- package/dist/node/command/command.type.js +1 -0
- package/dist/node/command/command.type.js.map +1 -0
- package/dist/node/command/command.util.js +110 -102
- package/dist/node/command/command.util.js.map +1 -0
- package/dist/node/command/index.js +1 -0
- package/dist/node/command/index.js.map +1 -0
- package/dist/node/express/express.type.d.ts +4 -0
- package/dist/node/express/express.util.js +53 -35
- package/dist/node/express/express.util.js.map +1 -0
- package/dist/node/express/index.js +1 -0
- package/dist/node/express/index.js.map +1 -0
- package/dist/node/fs/fs.test.unit.d.ts +1 -0
- package/dist/node/fs/fs.util.js +1 -0
- package/dist/node/fs/fs.util.js.map +1 -0
- package/dist/node/fs/index.js +1 -0
- package/dist/node/fs/index.js.map +1 -0
- package/dist/node/log/index.js +1 -0
- package/dist/node/log/index.js.map +1 -0
- package/dist/node/log/log.test.unit.d.ts +1 -0
- package/dist/node/log/log.type.js +1 -0
- package/dist/node/log/log.type.js.map +1 -0
- package/dist/node/log/log.util.js +1 -0
- package/dist/node/log/log.util.js.map +1 -0
- package/dist/node/mongo/index.d.ts +2 -0
- package/dist/node/mongo/index.js +21 -12
- package/dist/node/mongo/index.js.map +1 -0
- package/dist/node/mongo/mongo.constant.js +1 -0
- package/dist/node/mongo/mongo.constant.js.map +1 -0
- package/dist/node/mongo/mongo.controller.d.ts +5 -315
- package/dist/node/mongo/mongo.controller.mongoose.d.ts +234 -0
- package/dist/node/mongo/mongo.controller.mongoose.js +468 -0
- package/dist/node/mongo/mongo.controller.mongoose.js.map +1 -0
- package/dist/node/mongo/mongo.controller.native.d.ts +84 -0
- package/dist/node/mongo/mongo.controller.native.js +214 -0
- package/dist/node/mongo/mongo.controller.native.js.map +1 -0
- package/dist/node/mongo/mongo.dynamic-populate.d.ts +61 -0
- package/dist/node/mongo/mongo.dynamic-populate.js +197 -0
- package/dist/node/mongo/mongo.dynamic-populate.js.map +1 -0
- package/dist/node/mongo/mongo.populate.d.ts +15 -0
- package/dist/node/mongo/mongo.populate.js +269 -0
- package/dist/node/mongo/mongo.populate.js.map +1 -0
- package/dist/node/mongo/mongo.type.js +1 -0
- package/dist/node/mongo/mongo.type.js.map +1 -0
- package/dist/node/mongo/mongo.util.d.ts +52 -0
- package/dist/node/mongo/mongo.util.js +106 -363
- package/dist/node/mongo/mongo.util.js.map +1 -0
- package/dist/node/package/index.js +1 -0
- package/dist/node/package/index.js.map +1 -0
- package/dist/node/package/package.test.unit.d.ts +1 -0
- package/dist/node/package/package.type.js +1 -0
- package/dist/node/package/package.type.js.map +1 -0
- package/dist/node/package/package.util.js +20 -20
- package/dist/node/package/package.util.js.map +1 -0
- package/dist/node/path/index.js +1 -0
- package/dist/node/path/index.js.map +1 -0
- package/dist/node/path/path.constant.js +1 -0
- package/dist/node/path/path.constant.js.map +1 -0
- package/dist/node/path/path.util.js +1 -0
- package/dist/node/path/path.util.js.map +1 -0
- package/dist/node/storage/index.js +1 -0
- package/dist/node/storage/index.js.map +1 -0
- package/dist/node/storage/storage.constant.js +1 -0
- package/dist/node/storage/storage.constant.js.map +1 -0
- package/dist/node/storage/storage.util.js +1 -0
- package/dist/node/storage/storage.util.js.map +1 -0
- package/dist/node/upload/index.js +1 -0
- package/dist/node/upload/index.js.map +1 -0
- package/dist/node/upload/upload.constant.js +1 -0
- package/dist/node/upload/upload.constant.js.map +1 -0
- package/dist/node/upload/upload.type.js +1 -0
- package/dist/node/upload/upload.type.js.map +1 -0
- package/dist/node/upload/upload.util.js +1 -0
- package/dist/node/upload/upload.util.js.map +1 -0
- package/dist/node/ws/index.d.ts +1 -1
- package/dist/node/ws/index.js +2 -1
- package/dist/node/ws/index.js.map +1 -0
- package/dist/node/ws/{ts.util.js → ws.util.js} +1 -0
- package/dist/node/ws/ws.util.js.map +1 -0
- package/dist/node_modules/.pnpm/vitest@4.0.18_@types_node@25.3.3_jiti@2.6.1_jsdom@28.1.0_@noble_hashes@1.8.0__sass@1.97.3_tsx@4.21.0_yaml@2.8.2/node_modules/vitest/dist/config.js +1 -0
- package/dist/node_modules/.pnpm/vitest@4.0.18_@types_node@25.3.3_jiti@2.6.1_jsdom@28.1.0_@noble_hashes@1.8.0__sass@1.97.3_tsx@4.21.0_yaml@2.8.2/node_modules/vitest/dist/config.js.map +1 -0
- package/dist/react/apollo-client/apollo-client.component.js +1 -0
- package/dist/react/apollo-client/apollo-client.component.js.map +1 -0
- package/dist/react/apollo-client/apollo-client.constant.js +1 -0
- package/dist/react/apollo-client/apollo-client.constant.js.map +1 -0
- package/dist/react/apollo-client/apollo-client.context.js +1 -0
- package/dist/react/apollo-client/apollo-client.context.js.map +1 -0
- package/dist/react/apollo-client/apollo-client.module.scss.js +1 -0
- package/dist/react/apollo-client/apollo-client.module.scss.js.map +1 -0
- package/dist/react/apollo-client/apollo-client.util.js +1 -0
- package/dist/react/apollo-client/apollo-client.util.js.map +1 -0
- package/dist/react/apollo-client/index.js +1 -0
- package/dist/react/apollo-client/index.js.map +1 -0
- package/dist/react/apollo-client/links/index.js +1 -0
- package/dist/react/apollo-client/links/index.js.map +1 -0
- package/dist/react/apollo-client/links/upload.js +1 -0
- package/dist/react/apollo-client/links/upload.js.map +1 -0
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.component.js +1 -0
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.component.js.map +1 -0
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.rsc.js +1 -0
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.rsc.js.map +1 -0
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.util.js +1 -0
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.util.js.map +1 -0
- package/dist/react/apollo-client-nextjs/index.js +1 -0
- package/dist/react/apollo-client-nextjs/index.js.map +1 -0
- package/dist/react/apollo-error/apollo-error.component.js +1 -0
- package/dist/react/apollo-error/apollo-error.component.js.map +1 -0
- package/dist/react/apollo-error/apollo-error.context.js +1 -0
- package/dist/react/apollo-error/apollo-error.context.js.map +1 -0
- package/dist/react/apollo-error/apollo-error.hook.js +1 -0
- package/dist/react/apollo-error/apollo-error.hook.js.map +1 -0
- package/dist/react/apollo-error/apollo-error.module.scss.js +1 -0
- package/dist/react/apollo-error/apollo-error.module.scss.js.map +1 -0
- package/dist/react/apollo-error/apollo-error.provider.js +1 -0
- package/dist/react/apollo-error/apollo-error.provider.js.map +1 -0
- package/dist/react/apollo-error/apollo-error.util.js +1 -0
- package/dist/react/apollo-error/apollo-error.util.js.map +1 -0
- package/dist/react/apollo-error/index.js +1 -0
- package/dist/react/apollo-error/index.js.map +1 -0
- package/dist/react/i18next/i18next.hook.js +1 -0
- package/dist/react/i18next/i18next.hook.js.map +1 -0
- package/dist/react/i18next/i18next.util.js +1 -0
- package/dist/react/i18next/i18next.util.js.map +1 -0
- package/dist/react/i18next/index.js +1 -0
- package/dist/react/i18next/index.js.map +1 -0
- package/dist/react/loading/index.js +1 -0
- package/dist/react/loading/index.js.map +1 -0
- package/dist/react/loading/loading.component.js +1 -0
- package/dist/react/loading/loading.component.js.map +1 -0
- package/dist/react/loading/loading.context.js +1 -0
- package/dist/react/loading/loading.context.js.map +1 -0
- package/dist/react/loading/loading.hook.js +1 -0
- package/dist/react/loading/loading.hook.js.map +1 -0
- package/dist/react/loading/loading.module.scss.js +1 -0
- package/dist/react/loading/loading.module.scss.js.map +1 -0
- package/dist/react/loading/loading.provider.js +1 -0
- package/dist/react/loading/loading.provider.js.map +1 -0
- package/dist/react/log/index.js +1 -0
- package/dist/react/log/index.js.map +1 -0
- package/dist/react/log/log.util.js +1 -0
- package/dist/react/log/log.util.js.map +1 -0
- package/dist/react/next-intl/index.js +1 -0
- package/dist/react/next-intl/index.js.map +1 -0
- package/dist/react/next-intl/next-intl.constant.js +1 -0
- package/dist/react/next-intl/next-intl.constant.js.map +1 -0
- package/dist/react/next-intl/next-intl.context.js +1 -0
- package/dist/react/next-intl/next-intl.context.js.map +1 -0
- package/dist/react/next-intl/next-intl.hoc.js +1 -0
- package/dist/react/next-intl/next-intl.hoc.js.map +1 -0
- package/dist/react/next-intl/next-intl.hook.js +1 -0
- package/dist/react/next-intl/next-intl.hook.js.map +1 -0
- package/dist/react/next-intl/next-intl.provider.js +1 -0
- package/dist/react/next-intl/next-intl.provider.js.map +1 -0
- package/dist/react/storage/index.js +1 -0
- package/dist/react/storage/index.js.map +1 -0
- package/dist/react/storage/storage.hook.js +1 -0
- package/dist/react/storage/storage.hook.js.map +1 -0
- package/dist/react/storage/storage.test.unit.d.ts +1 -0
- package/dist/react/storage/storage.util.js +1 -0
- package/dist/react/storage/storage.util.js.map +1 -0
- package/dist/react/toast/index.js +1 -0
- package/dist/react/toast/index.js.map +1 -0
- package/dist/react/userback/index.js +1 -0
- package/dist/react/userback/index.js.map +1 -0
- package/dist/react/userback/userback.component.js +1 -0
- package/dist/react/userback/userback.component.js.map +1 -0
- package/dist/typescript/common.type.js +1 -0
- package/dist/typescript/common.type.js.map +1 -0
- package/dist/typescript/index.js +1 -0
- package/dist/typescript/index.js.map +1 -0
- package/dist/typescript/typescript.test.unit.d.ts +1 -0
- package/dist/util/common/common.util.js +1 -0
- package/dist/util/common/common.util.js.map +1 -0
- package/dist/util/common/index.js +1 -0
- package/dist/util/common/index.js.map +1 -0
- package/dist/util/index.js +1 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/object/index.js +1 -0
- package/dist/util/object/index.js.map +1 -0
- package/dist/util/object/object.util.js +1 -0
- package/dist/util/object/object.util.js.map +1 -0
- package/dist/util/serializer/index.js +1 -0
- package/dist/util/serializer/index.js.map +1 -0
- package/dist/util/serializer/serializer.util.js +1 -0
- package/dist/util/serializer/serializer.util.js.map +1 -0
- package/dist/util/string/index.js +1 -0
- package/dist/util/string/index.js.map +1 -0
- package/dist/util/string/string.util.js +1 -0
- package/dist/util/string/string.util.js.map +1 -0
- package/dist/util/validate/index.js +1 -0
- package/dist/util/validate/index.js.map +1 -0
- package/dist/util/validate/validate.util.js +1 -0
- package/dist/util/validate/validate.util.js.map +1 -0
- package/package.json +58 -87
- package/dist/config/commitlint/index.cjs +0 -1
- package/dist/config/config.type.cjs +0 -1
- package/dist/config/config.util.cjs +0 -1
- package/dist/config/env/env.constant.cjs +0 -1
- package/dist/config/env/env.util.cjs +0 -1
- package/dist/config/env/index.cjs +0 -1
- package/dist/config/eslint/index.cjs +0 -1
- package/dist/config/graphql-codegen/graphql-codegen.util.cjs +0 -1
- package/dist/config/graphql-codegen/index.cjs +0 -1
- package/dist/config/index.cjs +0 -1
- package/dist/config/lint-staged/index.cjs +0 -1
- package/dist/config/storybook/index.cjs +0 -1
- package/dist/config/storybook/storybook.main.cjs +0 -1
- package/dist/config/storybook/storybook.preview.cjs +0 -1
- package/dist/config/vitest/index.cjs +0 -1
- package/dist/config/vitest/vitest.e2e.cjs +0 -1
- package/dist/config/vitest/vitest.unit.cjs +0 -1
- package/dist/constant/common.cjs +0 -1
- package/dist/constant/index.cjs +0 -1
- package/dist/constant/response-status.cjs +0 -1
- package/dist/node/apollo-server/apollo-server.util.cjs +0 -1
- package/dist/node/apollo-server/index.cjs +0 -1
- package/dist/node/cli/index.cjs +0 -3
- package/dist/node/command/command.type.cjs +0 -1
- package/dist/node/command/command.util.cjs +0 -2
- package/dist/node/command/index.cjs +0 -1
- package/dist/node/express/express.util.cjs +0 -1
- package/dist/node/express/index.cjs +0 -1
- package/dist/node/fs/fs.util.cjs +0 -4
- package/dist/node/fs/index.cjs +0 -1
- package/dist/node/log/index.cjs +0 -1
- package/dist/node/log/log.type.cjs +0 -1
- package/dist/node/log/log.util.cjs +0 -1
- package/dist/node/mongo/index.cjs +0 -1
- package/dist/node/mongo/mongo.constant.cjs +0 -1
- package/dist/node/mongo/mongo.controller.cjs +0 -1
- package/dist/node/mongo/mongo.controller.js +0 -858
- package/dist/node/mongo/mongo.type.cjs +0 -1
- package/dist/node/mongo/mongo.util.cjs +0 -2
- package/dist/node/package/index.cjs +0 -1
- package/dist/node/package/package.type.cjs +0 -1
- package/dist/node/package/package.util.cjs +0 -1
- package/dist/node/path/index.cjs +0 -1
- package/dist/node/path/path.constant.cjs +0 -1
- package/dist/node/path/path.util.cjs +0 -1
- package/dist/node/storage/index.cjs +0 -1
- package/dist/node/storage/storage.constant.cjs +0 -1
- package/dist/node/storage/storage.util.cjs +0 -1
- package/dist/node/upload/index.cjs +0 -1
- package/dist/node/upload/upload.constant.cjs +0 -1
- package/dist/node/upload/upload.type.cjs +0 -1
- package/dist/node/upload/upload.util.cjs +0 -1
- package/dist/node/ws/index.cjs +0 -1
- package/dist/node/ws/ts.util.cjs +0 -1
- package/dist/node_modules/.pnpm/vitest@4.0.18_@types_node@25.3.3_jiti@2.6.1_jsdom@28.1.0_@noble_hashes@1.8.0__sass@1.97.3_tsx@4.21.0_yaml@2.8.2/node_modules/vitest/dist/config.cjs +0 -1
- package/dist/react/apollo-client/apollo-client.component.cjs +0 -1
- package/dist/react/apollo-client/apollo-client.constant.cjs +0 -1
- package/dist/react/apollo-client/apollo-client.context.cjs +0 -1
- package/dist/react/apollo-client/apollo-client.module.scss.cjs +0 -1
- package/dist/react/apollo-client/apollo-client.util.cjs +0 -1
- package/dist/react/apollo-client/index.cjs +0 -1
- package/dist/react/apollo-client/links/index.cjs +0 -1
- package/dist/react/apollo-client/links/upload.cjs +0 -1
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.component.cjs +0 -1
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.rsc.cjs +0 -1
- package/dist/react/apollo-client-nextjs/apollo-client-nextjs.util.cjs +0 -1
- package/dist/react/apollo-client-nextjs/index.cjs +0 -1
- package/dist/react/apollo-error/apollo-error.component.cjs +0 -1
- package/dist/react/apollo-error/apollo-error.context.cjs +0 -1
- package/dist/react/apollo-error/apollo-error.hook.cjs +0 -1
- package/dist/react/apollo-error/apollo-error.module.scss.cjs +0 -1
- package/dist/react/apollo-error/apollo-error.provider.cjs +0 -1
- package/dist/react/apollo-error/apollo-error.util.cjs +0 -1
- package/dist/react/apollo-error/index.cjs +0 -1
- package/dist/react/i18next/i18next.hook.cjs +0 -1
- package/dist/react/i18next/i18next.util.cjs +0 -1
- package/dist/react/i18next/index.cjs +0 -1
- package/dist/react/loading/index.cjs +0 -1
- package/dist/react/loading/loading.component.cjs +0 -6
- package/dist/react/loading/loading.context.cjs +0 -1
- package/dist/react/loading/loading.hook.cjs +0 -1
- package/dist/react/loading/loading.module.scss.cjs +0 -1
- package/dist/react/loading/loading.provider.cjs +0 -1
- package/dist/react/log/index.cjs +0 -1
- package/dist/react/log/log.util.cjs +0 -1
- package/dist/react/next-intl/index.cjs +0 -1
- package/dist/react/next-intl/next-intl.constant.cjs +0 -1
- package/dist/react/next-intl/next-intl.context.cjs +0 -1
- package/dist/react/next-intl/next-intl.hoc.cjs +0 -1
- package/dist/react/next-intl/next-intl.hook.cjs +0 -1
- package/dist/react/next-intl/next-intl.provider.cjs +0 -1
- package/dist/react/storage/index.cjs +0 -1
- package/dist/react/storage/storage.hook.cjs +0 -1
- package/dist/react/storage/storage.util.cjs +0 -1
- package/dist/react/toast/index.cjs +0 -1
- package/dist/react/userback/index.cjs +0 -1
- package/dist/react/userback/userback.component.cjs +0 -1
- package/dist/typescript/common.type.cjs +0 -1
- package/dist/typescript/index.cjs +0 -1
- package/dist/util/common/common.util.cjs +0 -1
- package/dist/util/common/index.cjs +0 -1
- package/dist/util/index.cjs +0 -1
- package/dist/util/object/index.cjs +0 -1
- package/dist/util/object/object.util.cjs +0 -1
- package/dist/util/serializer/index.cjs +0 -1
- package/dist/util/serializer/serializer.util.cjs +0 -1
- package/dist/util/string/index.cjs +0 -1
- package/dist/util/string/string.util.cjs +0 -1
- package/dist/util/validate/index.cjs +0 -1
- package/dist/util/validate/validate.util.cjs +0 -1
- /package/dist/node/ws/{ts.util.d.ts → ws.util.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.type.js","sources":["../../../src/node/package/package.type.ts"],"sourcesContent":["export interface I_PackageJson {\n name?: string;\n version?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface I_PackageInfo {\n name: string;\n currentVersion: string;\n latestVersion: string;\n isCurrentProject: boolean;\n isInstalled: boolean;\n isUpToDate: boolean;\n isDependency: boolean;\n isDevDependency: boolean;\n installedPath: string;\n file: I_PackageJson;\n}\n\nexport enum E_PackageType {\n DEPENDENCY = 'dependencies',\n DEV_DEPENDENCY = 'devDependencies',\n PEER_DEPENDENCY = 'peerDependencies',\n BUNDLE_DEPENDENCY = 'bundleDependencies',\n OPTIONAL_DEPENDENCY = 'optionalDependencies',\n}\n\nexport interface I_PackageInput {\n name: string;\n type?: E_PackageType;\n}\n"],"names":["E_PackageType"],"mappings":"AAqBO,IAAKA,sBAAAA,OACRA,EAAA,aAAa,gBACbA,EAAA,iBAAiB,mBACjBA,EAAA,kBAAkB,oBAClBA,EAAA,oBAAoB,sBACpBA,EAAA,sBAAsB,wBALdA,IAAAA,KAAA,CAAA,CAAA;"}
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import v from "node-fetch";
|
|
2
1
|
import { E_PackageType as c } from "./package.type.js";
|
|
3
|
-
import { pathExistsSync as D, readJsonSync as p, writeFileSync as
|
|
4
|
-
import { PATH as a, command as y, PACKAGE_JSON as
|
|
5
|
-
import { join as
|
|
2
|
+
import { pathExistsSync as D, readJsonSync as p, writeFileSync as v } from "../fs/fs.util.js";
|
|
3
|
+
import { PATH as a, command as y, PACKAGE_JSON as J, NODE_MODULES as S } from "../path/path.constant.js";
|
|
4
|
+
import { join as T } from "../path/path.util.js";
|
|
6
5
|
import { catchError as i, log as A } from "../log/log.util.js";
|
|
7
6
|
import { runCommand as E } from "../command/command.util.js";
|
|
8
|
-
import { getEnv as
|
|
9
|
-
const
|
|
10
|
-
async function
|
|
7
|
+
import { getEnv as _ } from "../../config/env/env.util.js";
|
|
8
|
+
const j = _();
|
|
9
|
+
async function O(e) {
|
|
11
10
|
try {
|
|
12
|
-
const s = await
|
|
11
|
+
const s = await fetch(`https://registry.npmjs.org/${e}/latest`);
|
|
13
12
|
if (!s.ok)
|
|
14
13
|
throw new Error(`Failed to fetch latest version: ${s.status} ${s.statusText}`);
|
|
15
14
|
const { version: r } = await s.json();
|
|
@@ -21,7 +20,7 @@ async function U(e) {
|
|
|
21
20
|
return i(s);
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
|
-
async function
|
|
23
|
+
async function U(e) {
|
|
25
24
|
try {
|
|
26
25
|
if (!e) {
|
|
27
26
|
if (D(a.PACKAGE_JSON)) {
|
|
@@ -91,7 +90,7 @@ async function G(e) {
|
|
|
91
90
|
file: s
|
|
92
91
|
}
|
|
93
92
|
};
|
|
94
|
-
const n = e.name in u, t = e.name in d, o = await
|
|
93
|
+
const n = e.name in u, t = e.name in d, o = await O(e.name);
|
|
95
94
|
if (!o.success)
|
|
96
95
|
return {
|
|
97
96
|
success: !0,
|
|
@@ -124,7 +123,7 @@ async function G(e) {
|
|
|
124
123
|
file: {}
|
|
125
124
|
}
|
|
126
125
|
};
|
|
127
|
-
const f = u[e.name] ?? d[e.name] ?? "", m =
|
|
126
|
+
const f = u[e.name] ?? d[e.name] ?? "", m = T(j.CWD, S, e.name, J);
|
|
128
127
|
if (!D(m))
|
|
129
128
|
return {
|
|
130
129
|
success: !0,
|
|
@@ -178,12 +177,12 @@ async function G(e) {
|
|
|
178
177
|
async function N(e) {
|
|
179
178
|
try {
|
|
180
179
|
const s = p(a.PACKAGE_JSON), r = s.dependencies ?? {}, l = s.devDependencies ?? {};
|
|
181
|
-
e.isDependency ? r[e.name] = e.latestVersion : e.isDevDependency && (l[e.name] = e.latestVersion),
|
|
180
|
+
e.isDependency ? r[e.name] = e.latestVersion : e.isDevDependency && (l[e.name] = e.latestVersion), v(a.PACKAGE_JSON, JSON.stringify(s, null, 4)), A.info(`Updated "${e.name}" to version ${e.latestVersion}`);
|
|
182
181
|
} catch (s) {
|
|
183
182
|
i(s);
|
|
184
183
|
}
|
|
185
184
|
}
|
|
186
|
-
async function
|
|
185
|
+
async function G() {
|
|
187
186
|
try {
|
|
188
187
|
try {
|
|
189
188
|
const e = await y.pnpmInstallStandard();
|
|
@@ -209,22 +208,23 @@ async function K() {
|
|
|
209
208
|
i(e);
|
|
210
209
|
}
|
|
211
210
|
}
|
|
212
|
-
async function
|
|
211
|
+
async function L(e, s) {
|
|
213
212
|
try {
|
|
214
213
|
if (!D(a.PACKAGE_JSON)) {
|
|
215
214
|
A.error("package.json not found. Aborting setup.");
|
|
216
215
|
return;
|
|
217
216
|
}
|
|
218
|
-
const l = (await Promise.all(e.map(
|
|
219
|
-
s?.install && u.length > 0 && n.push(...u.map(N)), s?.update && d.length > 0 && n.push(...d.map(N)), n.length > 0 && (await Promise.all(n), await
|
|
217
|
+
const l = (await Promise.all(e.map(U))).filter((t) => t.success && !!t.result && !t.result.isCurrentProject).map((t) => t.result), u = l.filter((t) => !t.isInstalled), d = l.filter((t) => !t.isUpToDate), n = [];
|
|
218
|
+
s?.install && u.length > 0 && n.push(...u.map(N)), s?.update && d.length > 0 && n.push(...d.map(N)), n.length > 0 && (await Promise.all(n), await G(), await E("Running ESLint with auto-fix", await y.eslintFix())), await s?.callback?.();
|
|
220
219
|
} catch (r) {
|
|
221
220
|
i(r);
|
|
222
221
|
}
|
|
223
222
|
}
|
|
224
223
|
export {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
224
|
+
O as getLatestPackageVersion,
|
|
225
|
+
U as getPackage,
|
|
226
|
+
G as installDependencies,
|
|
227
|
+
L as setupPackages,
|
|
229
228
|
N as updatePackage
|
|
230
229
|
};
|
|
230
|
+
//# sourceMappingURL=package.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.util.js","sources":["../../../src/node/package/package.util.ts"],"sourcesContent":["import type { I_Return } from '#typescript/index.js';\n\nimport { getEnv } from '#config/env/index.js';\n\nimport type { I_PackageInfo, I_PackageInput, I_PackageJson } from './package.type.js';\n\nimport { runCommand } from '../command/index.js';\nimport { pathExistsSync, readJsonSync, writeFileSync } from '../fs/index.js';\nimport { catchError, log } from '../log/index.js';\nimport { command, join, NODE_MODULES, PACKAGE_JSON, PATH } from '../path/index.js';\nimport { E_PackageType } from './package.type.js';\n\nconst env = getEnv();\n\n/**\n * Fetches the latest version of a package from the npm registry.\n * This function makes an HTTP request to the npm registry to get the latest version\n * information for a specified package.\n *\n * @param packageName - The name of the package to fetch the latest version for.\n * @returns A promise that resolves to a standardized response with the latest version string.\n */\nexport async function getLatestPackageVersion(packageName: string): Promise<I_Return<string>> {\n try {\n const res = await fetch(`https://registry.npmjs.org/${packageName}/latest`);\n\n if (!res.ok) {\n throw new Error(`Failed to fetch latest version: ${res.status} ${res.statusText}`);\n }\n\n const { version } = await res.json() as { version: string };\n\n return {\n success: true,\n result: version,\n };\n }\n catch (error) {\n return catchError<string>(error);\n }\n}\n\n/**\n * Retrieves comprehensive information about a package.\n * This function analyzes package information including:\n * - Current and latest versions\n * - Installation status and location\n * - Dependency type (regular, dev, peer, etc.)\n * - Whether it's the current project or an external dependency\n *\n * @param inputPackage - Optional package input configuration. If not provided, returns current project info.\n * @returns A promise that resolves to a standardized response with detailed package information.\n */\nexport async function getPackage(inputPackage?: I_PackageInput): Promise<I_Return<I_PackageInfo>> {\n try {\n if (!inputPackage) {\n if (pathExistsSync(PATH.PACKAGE_JSON)) {\n const packageJson = readJsonSync(PATH.PACKAGE_JSON) as I_PackageJson;\n const { name = '', version = '' } = packageJson;\n\n return {\n success: true,\n result: {\n name,\n currentVersion: version,\n latestVersion: version,\n isCurrentProject: true,\n isInstalled: true,\n isUpToDate: true,\n isDependency: false,\n isDevDependency: false,\n installedPath: PATH.PACKAGE_JSON,\n file: packageJson,\n },\n };\n }\n return {\n success: true,\n result: {\n name: '',\n currentVersion: '',\n latestVersion: '',\n isCurrentProject: false,\n isInstalled: false,\n isUpToDate: false,\n isDependency: false,\n isDevDependency: false,\n installedPath: '',\n file: {},\n },\n };\n }\n\n // if package.json does not exist\n if (!pathExistsSync(PATH.PACKAGE_JSON)) {\n return {\n success: true,\n result: {\n name: inputPackage.name,\n currentVersion: '',\n latestVersion: '',\n isCurrentProject: false,\n isInstalled: false,\n isUpToDate: false,\n isDependency: inputPackage.type === E_PackageType.DEPENDENCY,\n isDevDependency: inputPackage.type === E_PackageType.DEV_DEPENDENCY,\n installedPath: '',\n file: {},\n },\n };\n }\n\n const packageJson = readJsonSync(PATH.PACKAGE_JSON) as I_PackageJson;\n\n const { name, version = '', dependencies = {}, devDependencies = {} } = packageJson;\n\n // if it's the current project\n if (inputPackage.name === name) {\n return {\n success: true,\n result: {\n name,\n currentVersion: version,\n latestVersion: version,\n isCurrentProject: true,\n isInstalled: true,\n isUpToDate: true,\n isDependency: inputPackage.type === E_PackageType.DEPENDENCY,\n isDevDependency: inputPackage.type === E_PackageType.DEV_DEPENDENCY,\n installedPath: PATH.PACKAGE_JSON,\n file: packageJson,\n },\n };\n }\n\n const isDependency = inputPackage.name in dependencies;\n\n const isDevDependency = inputPackage.name in devDependencies;\n\n const latestVersionFound = await getLatestPackageVersion(inputPackage.name);\n\n if (!latestVersionFound.success) {\n return {\n success: true,\n result: {\n name: inputPackage.name,\n currentVersion: '',\n latestVersion: '',\n isCurrentProject: false,\n isInstalled: false,\n isUpToDate: false,\n isDependency,\n isDevDependency,\n installedPath: '',\n file: {},\n },\n };\n }\n\n // if it's not a dependency or devDependency\n if (!isDependency && !isDevDependency) {\n return {\n success: true,\n result: {\n name: inputPackage.name,\n currentVersion: '',\n latestVersion: latestVersionFound.result,\n isCurrentProject: false,\n isInstalled: false,\n isUpToDate: false,\n isDependency: inputPackage.type === E_PackageType.DEPENDENCY,\n isDevDependency: inputPackage.type === E_PackageType.DEV_DEPENDENCY,\n installedPath: '',\n file: {},\n },\n };\n }\n\n const packageJsonVersion = dependencies[inputPackage.name] ?? devDependencies[inputPackage.name] ?? '';\n const dependencyPackageJsonPath = join(env.CWD, NODE_MODULES, inputPackage.name, PACKAGE_JSON);\n\n // if package does not exist in node_modules\n if (!pathExistsSync(dependencyPackageJsonPath)) {\n return {\n success: true,\n result: {\n name: inputPackage.name,\n currentVersion: '',\n latestVersion: latestVersionFound.result,\n isCurrentProject: false,\n isInstalled: false,\n isUpToDate: false,\n isDependency,\n isDevDependency,\n installedPath: '',\n file: {},\n },\n };\n }\n\n const dependencyPackageJson = readJsonSync(dependencyPackageJsonPath) as I_PackageJson;\n\n const { version: dependencyVersion = '' } = dependencyPackageJson;\n\n // if version in package.json is different from version in node_modules\n if (packageJsonVersion !== dependencyVersion) {\n return {\n success: true,\n result: {\n name: inputPackage.name,\n currentVersion: dependencyVersion || packageJsonVersion,\n latestVersion: latestVersionFound.result,\n isCurrentProject: false,\n isInstalled: true,\n isUpToDate: false,\n isDependency,\n isDevDependency,\n installedPath: dependencyPackageJsonPath,\n file: dependencyPackageJson,\n },\n };\n }\n\n // if version in package.json is the same as version in node_modules\n return {\n success: true,\n result: {\n name: inputPackage.name,\n currentVersion: packageJsonVersion,\n latestVersion: latestVersionFound.result,\n isCurrentProject: false,\n isInstalled: true,\n isUpToDate: packageJsonVersion === latestVersionFound.result,\n isDependency,\n isDevDependency,\n installedPath: dependencyPackageJsonPath,\n file: dependencyPackageJson,\n },\n };\n }\n catch (error) {\n return catchError<I_PackageInfo>(error);\n }\n}\n\n/**\n * Updates a package to its latest version in package.json.\n * This function modifies the package.json file to update the specified package\n * to its latest version and logs the update action.\n *\n * @param packageInfo - The package information containing the latest version to update to.\n * @returns A promise that resolves when the update is complete.\n */\nexport async function updatePackage(packageInfo: I_PackageInfo): Promise<void> {\n try {\n const packageJson = readJsonSync(PATH.PACKAGE_JSON) as I_PackageJson;\n\n const dependencies = packageJson.dependencies ?? {};\n const devDependencies = packageJson.devDependencies ?? {};\n\n if (packageInfo.isDependency) {\n dependencies[packageInfo.name] = packageInfo.latestVersion;\n }\n else if (packageInfo.isDevDependency) {\n devDependencies[packageInfo.name] = packageInfo.latestVersion;\n }\n\n writeFileSync(PATH.PACKAGE_JSON, JSON.stringify(packageJson, null, 4));\n\n log.info(`Updated \"${packageInfo.name}\" to version ${packageInfo.latestVersion}`);\n }\n catch (error) {\n catchError(error);\n }\n}\n\n/**\n * Installs project dependencies using pnpm with fallback strategies.\n * This function attempts to install dependencies using different pnpm strategies:\n * 1. Standard installation\n * 2. Legacy peer dependencies mode\n * 3. Force installation mode\n *\n * @returns A promise that resolves when the installation is complete.\n */\nexport async function installDependencies(): Promise<void> {\n try {\n try {\n const cmd = await command.pnpmInstallStandard();\n await runCommand(`Installing dependencies (standard) using: ${cmd}`, cmd);\n return;\n }\n catch (error) {\n catchError(error);\n }\n\n try {\n const cmd = await command.pnpmInstallLegacy();\n await runCommand(`Retrying with legacy peer dependencies using: ${cmd}`, cmd);\n return;\n }\n catch (error) {\n catchError(error);\n }\n\n try {\n const cmd = await command.pnpmInstallForce();\n await runCommand(`Retrying with force install using: ${cmd}`, cmd);\n }\n catch (error) {\n catchError(error);\n }\n }\n catch (error) {\n catchError(error);\n }\n}\n\n/**\n * Sets up multiple packages with optional installation and update operations.\n * This function provides a comprehensive package management workflow that can:\n * - Install missing packages\n * - Update outdated packages\n * - Execute custom callbacks after package operations\n * - Run ESLint fixes after package changes\n *\n * @param packages - An array of package inputs to set up.\n * @param options - Optional configuration for installation, updates, and callbacks.\n * @param options.install - Whether to install missing packages (default: false).\n * @param options.update - Whether to update outdated packages (default: false).\n * @param options.callback - Optional callback function to execute after package operations.\n * @returns A promise that resolves when all package operations are complete.\n */\nexport async function setupPackages(\n packages: I_PackageInput[],\n options?: {\n install?: boolean;\n update?: boolean;\n callback?: () => Promise<void>;\n },\n): Promise<void> {\n try {\n if (!pathExistsSync(PATH.PACKAGE_JSON)) {\n log.error('package.json not found. Aborting setup.');\n return;\n }\n\n const packagesData = await Promise.all(packages.map(getPackage));\n\n const validPackages = packagesData\n .filter((pkg): pkg is { success: true; result: I_PackageInfo } => pkg.success && Boolean(pkg.result) && !pkg.result.isCurrentProject)\n .map(pkg => pkg.result);\n\n const packagesToInstall = validPackages.filter(pkg => !pkg.isInstalled);\n const packagesToUpdate = validPackages.filter(pkg => !pkg.isUpToDate);\n\n const tasks: Promise<void>[] = [];\n\n if (options?.install && packagesToInstall.length > 0) {\n tasks.push(...packagesToInstall.map(updatePackage));\n }\n\n if (options?.update && packagesToUpdate.length > 0) {\n tasks.push(...packagesToUpdate.map(updatePackage));\n }\n\n if (tasks.length > 0) {\n await Promise.all(tasks);\n await installDependencies();\n await runCommand('Running ESLint with auto-fix', await command.eslintFix());\n }\n\n await options?.callback?.();\n }\n catch (error) {\n catchError(error);\n }\n}\n"],"names":["env","getEnv","getLatestPackageVersion","packageName","res","version","error","catchError","getPackage","inputPackage","pathExistsSync","PATH","packageJson","readJsonSync","name","E_PackageType","dependencies","devDependencies","isDependency","isDevDependency","latestVersionFound","packageJsonVersion","dependencyPackageJsonPath","join","NODE_MODULES","PACKAGE_JSON","dependencyPackageJson","dependencyVersion","updatePackage","packageInfo","writeFileSync","log","installDependencies","cmd","command","runCommand","setupPackages","packages","options","validPackages","pkg","packagesToInstall","packagesToUpdate","tasks"],"mappings":"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"}
|
package/dist/node/path/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.constant.js","sources":["../../../src/node/path/path.constant.ts"],"sourcesContent":["import fsExtra from 'fs-extra';\n\nimport { getEnv } from '#config/env/index.js';\n\nimport type { I_CommandContext } from '../command/index.js';\nimport type { I_PackageInput, I_PackageJson } from '../package/index.js';\n\nimport { E_CommandType, formatCommand, rawCommand } from '../command/index.js';\nimport { E_PackageType, setupPackages } from '../package/index.js';\nimport { join, resolveWorkingPath } from './path.util.js';\n\nconst env = getEnv();\n\nexport const WORKING_DIRECTORY = env.CWD;\nexport const CYBERSKILL_PACKAGE_NAME = '@cyberskill/shared';\nexport const NODE_MODULES = 'node_modules';\nexport const BUILD_DIRECTORY = 'dist';\nexport const PUBLIC_DIRECTORY = 'public';\nexport const PACKAGE_JSON = 'package.json';\nexport const PACKAGE_LOCK_JSON = 'package-lock.json';\nexport const TSCONFIG_JSON = 'tsconfig.json';\nexport const GIT_IGNORE = '.gitignore';\nexport const SIMPLE_GIT_HOOK_JSON = '.simple-git-hooks.json';\nexport const PNPM_LOCK_YAML = 'pnpm-lock.yaml';\nexport const GIT_HOOK = '.git/hooks/';\nexport const GIT_COMMIT_EDITMSG = '.git/COMMIT_EDITMSG';\nexport const GIT_EXCLUDE = '.git/info/exclude';\nexport const MIGRATE_MONGO_CONFIG = '.migrate-mongo.config.js';\nexport const CYBERSKILL_DIRECTORY = (() => {\n const packageJson = fsExtra.readJsonSync(resolveWorkingPath(PACKAGE_JSON)) as I_PackageJson;\n\n const baseDirectory = packageJson.name === CYBERSKILL_PACKAGE_NAME\n ? join(WORKING_DIRECTORY, BUILD_DIRECTORY)\n : join(WORKING_DIRECTORY, NODE_MODULES, CYBERSKILL_PACKAGE_NAME, BUILD_DIRECTORY);\n\n return baseDirectory;\n})();\nexport const CYBERSKILL_CLI = 'cyberskill';\nexport const CYBERSKILL_CLI_PATH = 'src/node/cli/index.ts';\nexport const ESLINT_PACKAGE_NAME = 'eslint';\nexport const ESLINT_CLI = 'eslint';\nexport const VITEST_PACKAGE_NAME = 'vitest';\nexport const VITEST_CLI = 'vitest';\nexport const COMMIT_LINT_PACKAGE_NAME = '@commitlint/cli';\nexport const COMMIT_LINT_CONVENTIONAL_CONFIG_PACKAGE_NAME = '@commitlint/config-conventional';\nexport const COMMIT_LINT_CLI = 'commitlint';\nexport const LINT_STAGED_PACKAGE_NAME = 'lint-staged';\nexport const LINT_STAGED_CLI = 'lint-staged';\nexport const TSC_PACKAGE_NAME = 'typescript';\nexport const TSC_CLI = 'tsc';\nexport const TSX_CLI = 'tsx';\nexport const GIT_CLI = 'git';\nexport const PNPM_CLI = 'pnpm';\nexport const PNPM_EXEC_CLI = 'pnpm exec';\nexport const SIMPLE_GIT_HOOKS_PACKAGE_NAME = 'simple-git-hooks';\nexport const SIMPLE_GIT_HOOK_CLI = 'simple-git-hooks';\nexport const ESLINT_INSPECT_PACKAGE_NAME = '@eslint/config-inspector';\nexport const ESLINT_INSPECT_CLI = 'eslint-config-inspector';\nexport const NODE_MODULES_INSPECT_PACKAGE_NAME = 'node-modules-inspector';\nexport const NODE_MODULES_INSPECT_CLI = 'node-modules-inspector';\nexport const MIGRATE_MONGO_PACKAGE_NAME = 'migrate-mongo';\nexport const MIGRATE_MONGO_CLI = './node_modules/migrate-mongo/bin/migrate-mongo';\nexport const STORYBOOK_PACKAGE_NAME = 'storybook';\nexport const STORYBOOK_CLI = 'storybook';\nexport const AG_KIT_PACKAGE_NAME = '@vudovn/ag-kit';\nexport const DOT_AGENT = '.agent';\n\nexport const PATH = {\n CYBERSKILL_DIRECTORY,\n WORKING_DIRECTORY,\n PUBLIC_DIRECTORY: resolveWorkingPath(PUBLIC_DIRECTORY),\n TS_CONFIG: resolveWorkingPath(TSCONFIG_JSON),\n GIT_IGNORE: resolveWorkingPath(GIT_IGNORE),\n GIT_HOOK: resolveWorkingPath(GIT_HOOK),\n GIT_COMMIT_MSG: resolveWorkingPath(GIT_COMMIT_EDITMSG),\n GIT_EXCLUDE: resolveWorkingPath(GIT_EXCLUDE),\n SIMPLE_GIT_HOOKS_JSON: resolveWorkingPath(SIMPLE_GIT_HOOK_JSON),\n PACKAGE_JSON: resolveWorkingPath(PACKAGE_JSON),\n PACKAGE_LOCK_JSON: resolveWorkingPath(PACKAGE_LOCK_JSON),\n PNPM_LOCK_YAML: resolveWorkingPath(PNPM_LOCK_YAML),\n NODE_MODULES: resolveWorkingPath(NODE_MODULES),\n MIGRATE_MONGO_CONFIG: resolveWorkingPath(MIGRATE_MONGO_CONFIG),\n LINT_STAGED_CONFIG: resolveWorkingPath(`${CYBERSKILL_DIRECTORY}/config/lint-staged/index.js`),\n COMMITLINT_CONFIG: resolveWorkingPath(`${CYBERSKILL_DIRECTORY}/config/commitlint/index.js`),\n VITEST_UNIT_CONFIG: resolveWorkingPath(`${CYBERSKILL_DIRECTORY}/config/vitest/vitest.unit.js`),\n VITEST_E2E_CONFIG: resolveWorkingPath(`${CYBERSKILL_DIRECTORY}/config/vitest/vitest.e2e.js`),\n STORYBOOK_MAIN_CONFIG: resolveWorkingPath(`${CYBERSKILL_DIRECTORY}/config/storybook/storybook.main.js`),\n STORYBOOK_PREVIEW_CONFIG: resolveWorkingPath(`${CYBERSKILL_DIRECTORY}/config/storybook/storybook.preview.js`),\n DOT_AGENT: resolveWorkingPath(DOT_AGENT),\n};\n\n/**\n * Creates Git hooks configuration based on whether this is the current project.\n * This function generates a configuration object for Git hooks that includes\n * pre-commit and commit-msg hooks, with an optional pre-push hook for the current project.\n *\n * @param context - Context object containing project information.\n * @param context.isCurrentProject - Whether this is the current project being worked on.\n * @returns A Git hooks configuration object with appropriate commands for each hook.\n */\nexport function createGitHooksConfig({ isCurrentProject }: Partial<I_CommandContext>) {\n return {\n 'pre-commit': LINT_STAGED_CLI,\n 'commit-msg': COMMIT_LINT_CLI,\n ...(isCurrentProject ? { 'pre-push': rawCommand(`${GIT_CLI} pull`) } : { 'pre-push': rawCommand(`TAG_ONLY=true; while read local_ref local_oid remote_ref remote_oid; do case \\\"$local_ref\\\" in refs/tags/*) ;; *) TAG_ONLY=false; break ;; esac; done; if [ \\\"$TAG_ONLY\\\" = true ]; then echo '[pre-push] Tag-only push, skipping build.'; exit 0; fi; ${PNPM_CLI} build`) }),\n };\n}\n\n/**\n * Builds a command function based on the specified type and configuration.\n * This function creates a command executor that handles different command types\n * including CLI commands and string commands. It manages package dependencies\n * and formats commands appropriately for execution.\n *\n * The function supports:\n * - CLI commands that require package installation\n * - String commands that are executed directly\n * - Automatic package dependency management\n * - Command formatting and validation\n *\n * @param config - Configuration object containing type, packages, and command properties.\n * @param config.type - The type of command to build (CLI or STRING).\n * @param config.packages - Optional array of packages required for CLI commands.\n * @param config.command - The command string to execute.\n * @returns A function that returns a promise resolving to the formatted command string.\n * @throws {Error} When an unsupported command type is provided.\n */\nfunction buildCommand({ type, packages, command }: { type: E_CommandType; packages?: I_PackageInput[]; command: string }): () => Promise<string> {\n const uniquePackages = packages?.reduce((acc: I_PackageInput[], pkg) => {\n if (!acc.some(existingPkg => existingPkg.name === pkg.name)) {\n acc.push(pkg);\n }\n return acc;\n }, []);\n\n return async () => {\n switch (type) {\n case E_CommandType.CLI: {\n if (uniquePackages?.length) {\n await setupPackages(uniquePackages, {\n install: true,\n });\n }\n\n return formatCommand(rawCommand(`${PNPM_EXEC_CLI} ${command}`)) as string;\n }\n case E_CommandType.STRING: {\n return formatCommand(rawCommand(command)) as string;\n }\n default: {\n throw new Error('Unsupported command type');\n }\n }\n };\n}\n\nexport const command = {\n simpleGitHooks: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: SIMPLE_GIT_HOOKS_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n\n ],\n command: SIMPLE_GIT_HOOK_CLI,\n }),\n eslintInspect: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name:\n ESLINT_INSPECT_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n\n ],\n command: ESLINT_INSPECT_CLI,\n }),\n nodeModulesInspect: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: NODE_MODULES_INSPECT_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n\n ],\n command: NODE_MODULES_INSPECT_CLI,\n }),\n eslintCheck: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: ESLINT_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n\n ],\n command: `${ESLINT_CLI} ${PATH.WORKING_DIRECTORY} --no-cache`,\n }),\n eslintFix: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: ESLINT_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n\n ],\n command: `${ESLINT_CLI} ${PATH.WORKING_DIRECTORY} --fix --no-cache`,\n }),\n typescriptCheck: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: TSC_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n\n ],\n command: `${TSC_CLI} -p ${PATH.TS_CONFIG} --noEmit`,\n }),\n testUnit: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: VITEST_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n ],\n command: `${VITEST_CLI} --config ${PATH.VITEST_UNIT_CONFIG}`,\n }),\n testE2e: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: VITEST_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n ],\n command: `${VITEST_CLI} --config ${PATH.VITEST_E2E_CONFIG}`,\n }),\n mongoMigrateCreate: (migrateName: string) => {\n if (!/^[\\w-]+$/.test(migrateName)) {\n throw new Error('Migration name must only contain alphanumeric characters, underscores, and hyphens.');\n }\n\n return buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: TSX_CLI,\n type: E_PackageType.DEPENDENCY,\n },\n {\n name: MIGRATE_MONGO_PACKAGE_NAME,\n type: E_PackageType.DEPENDENCY,\n },\n ],\n command: `${TSX_CLI} ${MIGRATE_MONGO_CLI} create ${migrateName} -f ${PATH.MIGRATE_MONGO_CONFIG}`,\n })();\n },\n mongoMigrateUp: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: TSX_CLI,\n type: E_PackageType.DEPENDENCY,\n },\n {\n name: MIGRATE_MONGO_PACKAGE_NAME,\n type: E_PackageType.DEPENDENCY,\n },\n ],\n command: `${TSX_CLI} ${MIGRATE_MONGO_CLI} up -f ${PATH.MIGRATE_MONGO_CONFIG}`,\n }),\n mongoMigrateDown: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: TSX_CLI,\n type: E_PackageType.DEPENDENCY,\n },\n {\n name: MIGRATE_MONGO_PACKAGE_NAME,\n type: E_PackageType.DEPENDENCY,\n },\n ],\n command: `${TSX_CLI} ${MIGRATE_MONGO_CLI} down -f ${PATH.MIGRATE_MONGO_CONFIG}`,\n }),\n commitLint: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: COMMIT_LINT_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n {\n name: COMMIT_LINT_CONVENTIONAL_CONFIG_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n ],\n command: `${COMMIT_LINT_CLI} --edit ${PATH.GIT_COMMIT_MSG} --config ${PATH.COMMITLINT_CONFIG}`,\n }),\n lintStaged: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: LINT_STAGED_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n ],\n command: `${LINT_STAGED_CLI} --config ${PATH.LINT_STAGED_CONFIG}`,\n }),\n configureGitHook: buildCommand({\n type: E_CommandType.STRING,\n command: `${GIT_CLI} config core.hooksPath ${PATH.GIT_HOOK}`,\n }),\n build: buildCommand({\n type: E_CommandType.STRING,\n command: `${PNPM_CLI} run --if-present build`,\n }),\n pnpmInstallStandard: buildCommand({\n type: E_CommandType.STRING,\n command: `${PNPM_CLI} install --ignore-scripts`,\n }),\n pnpmInstallLegacy: buildCommand({\n type: E_CommandType.STRING,\n command: `${PNPM_CLI} install --ignore-scripts --legacy-peer-deps`,\n }),\n pnpmInstallForce: buildCommand({\n type: E_CommandType.STRING,\n command: `${PNPM_CLI} install --ignore-scripts --force`,\n }),\n pnpmPruneStore: buildCommand({\n type: E_CommandType.STRING,\n command: `${PNPM_CLI} store prune`,\n }),\n pnpmCleanCache: buildCommand({\n type: E_CommandType.STRING,\n command: `${PNPM_CLI} cache delete`,\n }),\n storybookDev: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: STORYBOOK_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n ],\n command: `${STORYBOOK_CLI} dev`,\n }),\n storybookBuild: buildCommand({\n type: E_CommandType.CLI,\n packages: [\n {\n name: STORYBOOK_PACKAGE_NAME,\n type: E_PackageType.DEV_DEPENDENCY,\n },\n ],\n command: `${STORYBOOK_CLI} build`,\n }),\n};\n"],"names":["env","getEnv","WORKING_DIRECTORY","CYBERSKILL_PACKAGE_NAME","NODE_MODULES","BUILD_DIRECTORY","PUBLIC_DIRECTORY","PACKAGE_JSON","PACKAGE_LOCK_JSON","TSCONFIG_JSON","GIT_IGNORE","SIMPLE_GIT_HOOK_JSON","PNPM_LOCK_YAML","GIT_HOOK","GIT_COMMIT_EDITMSG","GIT_EXCLUDE","MIGRATE_MONGO_CONFIG","CYBERSKILL_DIRECTORY","fsExtra","resolveWorkingPath","join","CYBERSKILL_CLI","CYBERSKILL_CLI_PATH","ESLINT_PACKAGE_NAME","ESLINT_CLI","VITEST_PACKAGE_NAME","VITEST_CLI","COMMIT_LINT_PACKAGE_NAME","COMMIT_LINT_CONVENTIONAL_CONFIG_PACKAGE_NAME","COMMIT_LINT_CLI","LINT_STAGED_PACKAGE_NAME","LINT_STAGED_CLI","TSC_PACKAGE_NAME","TSC_CLI","TSX_CLI","GIT_CLI","PNPM_CLI","PNPM_EXEC_CLI","SIMPLE_GIT_HOOKS_PACKAGE_NAME","SIMPLE_GIT_HOOK_CLI","ESLINT_INSPECT_PACKAGE_NAME","ESLINT_INSPECT_CLI","NODE_MODULES_INSPECT_PACKAGE_NAME","NODE_MODULES_INSPECT_CLI","MIGRATE_MONGO_PACKAGE_NAME","MIGRATE_MONGO_CLI","STORYBOOK_PACKAGE_NAME","STORYBOOK_CLI","AG_KIT_PACKAGE_NAME","DOT_AGENT","PATH","createGitHooksConfig","isCurrentProject","rawCommand","buildCommand","type","packages","command","uniquePackages","acc","pkg","existingPkg","E_CommandType","setupPackages","formatCommand","E_PackageType","migrateName"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.util.js","sources":["../../../src/node/path/path.util.ts"],"sourcesContent":["import pathNode from 'node:path';\n\nimport { getEnv } from '#config/env/index.js';\n\nconst env = getEnv();\n\nexport const path = pathNode;\n\nexport const dirname = path.dirname;\n\n/**\n * Resolves a path relative to the current working directory.\n * This function creates an absolute path by combining the current working directory\n * with the provided path segments, ensuring consistent path resolution across the application.\n *\n * @param urls - Path segments to resolve relative to the current working directory.\n * @returns An absolute path string resolved from the current working directory.\n */\nexport function resolveWorkingPath(...urls: string[]): string {\n return path.resolve(env.CWD, ...urls);\n}\n\n/**\n * Resolves an absolute path from the provided path segments.\n * This function creates an absolute path by combining the provided path segments,\n * similar to Node.js path.resolve but without using the current working directory as base.\n *\n * @param urls - Path segments to resolve into an absolute path.\n * @returns An absolute path string resolved from the provided segments.\n */\nexport function resolve(...urls: string[]): string {\n return path.resolve(...urls);\n}\n\n/**\n * Joins path segments into a single path string.\n * This function combines multiple path segments using the appropriate path separator\n * for the current operating system, similar to Node.js path.join.\n *\n * @param urls - Path segments to join together.\n * @returns A joined path string with appropriate separators.\n */\nexport function join(...urls: string[]): string {\n return path.join(...urls);\n}\n"],"names":["env","getEnv","path","pathNode","dirname","resolveWorkingPath","urls","resolve","join"],"mappings":";;AAIA,MAAMA,IAAMC,EAAA,GAECC,IAAOC,GAEPC,IAAUF,EAAK;AAUrB,SAASG,KAAsBC,GAAwB;AAC1D,SAAOJ,EAAK,QAAQF,EAAI,KAAK,GAAGM,CAAI;AACxC;AAUO,SAASC,KAAWD,GAAwB;AAC/C,SAAOJ,EAAK,QAAQ,GAAGI,CAAI;AAC/B;AAUO,SAASE,KAAQF,GAAwB;AAC5C,SAAOJ,EAAK,KAAK,GAAGI,CAAI;AAC5B;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.constant.js","sources":["../../../src/node/storage/storage.constant.ts"],"sourcesContent":["export const NODE_FS_DRIVER_NAME = 'localforage-node-fs';\nexport const STORAGE_KEY_EXTENSION = '.json';\nexport const STORAGE_INSTANCE_NAME = 'cyberskill';\nexport const STORAGE_STORE_NAME = 'node-storage';\n"],"names":["NODE_FS_DRIVER_NAME","STORAGE_KEY_EXTENSION","STORAGE_INSTANCE_NAME","STORAGE_STORE_NAME"],"mappings":"AAAO,MAAMA,IAAsB,uBACtBC,IAAwB,SACxBC,IAAwB,cACxBC,IAAqB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.util.js","sources":["../../../src/node/storage/storage.util.ts"],"sourcesContent":["import localForage from 'localforage';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { getEnv } from '#config/env/index.js';\n\nimport type { LocalForageDriver, NodeFsDriverState, NodeLocalForageOptions } from './storage.type.js';\n\nimport { catchError, log } from '../log/index.js';\nimport { NODE_FS_DRIVER_NAME, STORAGE_INSTANCE_NAME, STORAGE_KEY_EXTENSION, STORAGE_STORE_NAME } from './storage.constant.js';\n\nconst env = getEnv();\n\nconst nodeFsDriverState: NodeFsDriverState = {\n baseDir: env.CYBERSKILL_STORAGE_DIRECTORY,\n};\n\n/**\n * Encodes a storage key into a filename-safe string.\n */\nfunction encodeKey(key: string): string {\n return `${encodeURIComponent(key)}${STORAGE_KEY_EXTENSION}`;\n}\n\n/**\n * Decodes a filename-safe key back to the original storage key.\n */\nfunction decodeKey(fileName: string): string {\n return decodeURIComponent(fileName.slice(0, -STORAGE_KEY_EXTENSION.length));\n}\n\n/**\n * Maps a storage key to an absolute file path inside the storage directory.\n */\nfunction getFilePath(key: string, baseDir: string): string {\n return path.join(baseDir, encodeKey(key));\n}\n\n/**\n * Custom localForage driver that stores JSON-encoded values on the filesystem.\n */\nconst nodeFsDriver: LocalForageDriver = {\n _driver: NODE_FS_DRIVER_NAME,\n _support: true,\n /** Ensures the storage directory exists and respects custom baseDir overrides. */\n async _initStorage(options: unknown) {\n try {\n const baseDirFromOptions = typeof options === 'object' && options !== null && 'baseDir' in options\n ? (options as { baseDir?: unknown }).baseDir\n : undefined;\n\n if (typeof baseDirFromOptions === 'string' && baseDirFromOptions.length > 0) {\n nodeFsDriverState.baseDir = baseDirFromOptions;\n }\n else {\n nodeFsDriverState.baseDir = env.CYBERSKILL_STORAGE_DIRECTORY;\n }\n\n await fs.mkdir(nodeFsDriverState.baseDir, { recursive: true });\n }\n catch (error) {\n log.error('[Storage:init]', error);\n throw error;\n }\n },\n /** Deletes all stored entries by recreating the directory. */\n async clear() {\n const { baseDir } = nodeFsDriverState;\n\n await fs.rm(baseDir, { recursive: true, force: true });\n await fs.mkdir(baseDir, { recursive: true });\n },\n /** Reads and parses a stored value; returns null when the file is missing. */\n async getItem<T>(key: string): Promise<T | null> {\n const { baseDir } = nodeFsDriverState;\n const filePath = getFilePath(key, baseDir);\n\n try {\n const content = await fs.readFile(filePath, 'utf8');\n\n return JSON.parse(content) as T;\n }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n },\n /** Iterates through all keys, invoking the iterator until it returns a value. */\n async iterate<T, U>(iterator: (value: T, key: string, iterationNumber: number) => U): Promise<U> {\n const keys = await nodeFsDriver.keys();\n let iterationNumber = 1;\n\n for (const key of keys) {\n const value = await nodeFsDriver.getItem<T>(key);\n\n const result = iterator(value as T, key, iterationNumber);\n\n if (result !== undefined) {\n return result;\n }\n iterationNumber += 1;\n }\n\n return undefined as unknown as U;\n },\n /** Returns the key name at the given index or null when out of bounds. */\n async key(keyIndex: number): Promise<string> {\n const keys = await nodeFsDriver.keys();\n\n return keys[keyIndex] ?? null as unknown as string;\n },\n /** Lists all stored keys. */\n async keys(): Promise<string[]> {\n const { baseDir } = nodeFsDriverState;\n\n try {\n const files = await fs.readdir(baseDir);\n\n return files\n .filter(file => file.endsWith(STORAGE_KEY_EXTENSION))\n .map(decodeKey);\n }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n },\n /** Returns the count of stored keys. */\n async length(): Promise<number> {\n const keys = await nodeFsDriver.keys();\n\n return keys.length;\n },\n /** Removes a stored value for the given key. */\n async removeItem(key: string): Promise<void> {\n const { baseDir } = nodeFsDriverState;\n const filePath = getFilePath(key, baseDir);\n\n await fs.rm(filePath, { force: true });\n },\n /** Stores a value as JSON on disk. */\n async setItem<T>(key: string, value: T): Promise<T> {\n const { baseDir } = nodeFsDriverState;\n const filePath = getFilePath(key, baseDir);\n\n await fs.mkdir(baseDir, { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(value), 'utf8');\n\n return value;\n },\n};\n\nlet initPromise: Promise<void> | null = null;\nlet driverInstance: LocalForageDriver | null = null;\n\n/**\n * Prepares and returns the filesystem-backed localForage driver.\n * We bypass localForage's default driver selection and explicitly initialize\n * our custom driver to ensure Node compatibility.\n */\nasync function ensureLocalForageReady(): Promise<LocalForageDriver> {\n if (initPromise) {\n await initPromise;\n return driverInstance as LocalForageDriver;\n }\n\n initPromise = (async () => {\n await localForage.defineDriver(nodeFsDriver);\n nodeFsDriverState.baseDir = env.CYBERSKILL_STORAGE_DIRECTORY;\n const driver = await localForage.getDriver(NODE_FS_DRIVER_NAME);\n\n const initOptions = {\n baseDir: nodeFsDriverState.baseDir,\n name: STORAGE_INSTANCE_NAME,\n storeName: STORAGE_STORE_NAME,\n } satisfies NodeLocalForageOptions;\n\n await driver._initStorage(initOptions as unknown as Parameters<typeof driver._initStorage>[0]);\n driverInstance = driver;\n })().catch((error) => {\n initPromise = null;\n throw error;\n });\n\n await initPromise;\n\n return driverInstance as LocalForageDriver;\n}\n\n/**\n * Persistent storage utility object for data persistence across application sessions.\n * This object provides methods for storing, retrieving, and managing data using localForage,\n * with automatic initialization and error handling.\n */\nexport const storage = {\n /**\n * Retrieves a value from persistent storage by key.\n * This method fetches data that was previously stored using the set method.\n * Returns null if the key doesn't exist or if an error occurs.\n *\n * @param key - The unique identifier for the stored value.\n * @returns A promise that resolves to the stored value or null if not found.\n */\n async get<T = unknown>(key: string): Promise<T | null> {\n try {\n const driver = await ensureLocalForageReady();\n const result = await driver.getItem<T>(key);\n\n return result ?? null;\n }\n catch (error) {\n return catchError(error, { returnValue: null });\n }\n },\n /**\n * Stores a value in persistent storage with a unique key.\n * This method saves data that can be retrieved later using the get method.\n * The data is automatically serialized and stored in the configured storage directory.\n *\n * @param key - The unique identifier for the value to store.\n * @param value - The data to store (will be automatically serialized).\n * @returns A promise that resolves when the storage operation is complete.\n */\n async set<T = unknown>(key: string, value: T): Promise<void> {\n try {\n const driver = await ensureLocalForageReady();\n\n await driver.setItem(key, value);\n }\n catch (error) {\n catchError(error);\n }\n },\n /**\n * Removes a value from persistent storage by key.\n * This method permanently deletes the stored data associated with the specified key.\n *\n * @param key - The unique identifier of the value to remove.\n * @returns A promise that resolves when the removal operation is complete.\n */\n async remove(key: string): Promise<void> {\n try {\n const driver = await ensureLocalForageReady();\n\n await driver.removeItem(key);\n }\n catch (error) {\n catchError(error);\n }\n },\n /**\n * Retrieves all storage keys.\n * This method returns an array of all keys that currently have stored values.\n * Returns an empty array if no keys exist or if an error occurs.\n *\n * @returns A promise that resolves to an array of storage keys.\n */\n async keys(): Promise<string[]> {\n try {\n const driver = await ensureLocalForageReady();\n const keys = await driver.keys();\n\n if (!Array.isArray(keys)) {\n log.warn(`[Storage:keys] Invalid keys response:`, keys);\n return [];\n }\n\n return keys;\n }\n catch (error) {\n return catchError(error, { returnValue: [] });\n }\n },\n /**\n * Gets a human-readable log link for a storage key.\n * This method provides a formatted string that shows the storage directory path\n * and the key name for debugging and manual inspection purposes.\n *\n * @param key - The storage key to generate a log link for.\n * @returns A promise that resolves to a formatted log link string or null if an error occurs.\n */\n async getLogLink(key: string): Promise<string | null> {\n try {\n const storagePath = path.join(env.CYBERSKILL_STORAGE_DIRECTORY, encodeKey(key));\n\n return `${storagePath} (key: ${key})`;\n }\n catch (error) {\n return catchError(error, { returnValue: null });\n }\n },\n\n};\n"],"names":["env","getEnv","nodeFsDriverState","encodeKey","key","STORAGE_KEY_EXTENSION","decodeKey","fileName","getFilePath","baseDir","path","nodeFsDriver","NODE_FS_DRIVER_NAME","options","baseDirFromOptions","fs","error","log","filePath","content","iterator","keys","iterationNumber","value","result","keyIndex","file","initPromise","driverInstance","ensureLocalForageReady","localForage","driver","initOptions","STORAGE_INSTANCE_NAME","STORAGE_STORE_NAME","storage","catchError"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.constant.js","sources":["../../../src/node/upload/upload.constant.ts"],"sourcesContent":["import { E_UploadType } from './upload.type.js';\n\nexport const BYTES_PER_MB = 1024 * 1024;\n\nexport const DEFAULT_UPLOAD_CONFIG = {\n [E_UploadType.IMAGE]: {\n allowedExtensions: ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg'],\n sizeLimit: 5 * 1024 * 1024, // 5MB\n },\n [E_UploadType.VIDEO]: {\n allowedExtensions: ['mp4', 'avi', 'mov', 'wmv', 'flv', 'webm'],\n sizeLimit: 500 * 1024 * 1024, // 500MB\n },\n [E_UploadType.AUDIO]: {\n allowedExtensions: ['mp3', 'wav', 'ogg', 'm4a', 'aac'],\n sizeLimit: 50 * 1024 * 1024, // 50MB\n },\n [E_UploadType.DOCUMENT]: {\n allowedExtensions: ['pdf', 'doc', 'docx', 'txt', 'rtf'],\n sizeLimit: 10 * 1024 * 1024, // 10MB\n },\n [E_UploadType.OTHER]: {\n allowedExtensions: ['zip', 'rar', 'tar', 'gz'],\n sizeLimit: 5 * 1024 * 1024, // 5MB\n },\n};\n"],"names":["BYTES_PER_MB","DEFAULT_UPLOAD_CONFIG","E_UploadType"],"mappings":";AAEO,MAAMA,IAAe,OAAO,MAEtBC,IAAwB;AAAA,EACjC,CAACC,EAAa,KAAK,GAAG;AAAA,IAClB,mBAAmB,CAAC,OAAO,QAAQ,OAAO,OAAO,QAAQ,KAAK;AAAA,IAC9D,WAAW,IAAI,OAAO;AAAA;AAAA,EAAA;AAAA,EAE1B,CAACA,EAAa,KAAK,GAAG;AAAA,IAClB,mBAAmB,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM;AAAA,IAC7D,WAAW,MAAM,OAAO;AAAA;AAAA,EAAA;AAAA,EAE5B,CAACA,EAAa,KAAK,GAAG;AAAA,IAClB,mBAAmB,CAAC,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IACrD,WAAW,KAAK,OAAO;AAAA;AAAA,EAAA;AAAA,EAE3B,CAACA,EAAa,QAAQ,GAAG;AAAA,IACrB,mBAAmB,CAAC,OAAO,OAAO,QAAQ,OAAO,KAAK;AAAA,IACtD,WAAW,KAAK,OAAO;AAAA;AAAA,EAAA;AAAA,EAE3B,CAACA,EAAa,KAAK,GAAG;AAAA,IAClB,mBAAmB,CAAC,OAAO,OAAO,OAAO,IAAI;AAAA,IAC7C,WAAW,IAAI,OAAO;AAAA;AAAA,EAAA;AAE9B;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.type.js","sources":["../../../src/node/upload/upload.type.ts"],"sourcesContent":["export enum E_UploadType {\n IMAGE = 'IMAGE',\n VIDEO = 'VIDEO',\n AUDIO = 'AUDIO',\n DOCUMENT = 'DOCUMENT',\n OTHER = 'OTHER',\n}\n\nexport interface I_UploadValidationConfig {\n filename: string;\n fileSize?: number;\n}\n\nexport interface I_UploadTypeConfig {\n allowedExtensions: string[];\n sizeLimit: number;\n}\n\nexport interface I_UploadConfig {\n [E_UploadType.IMAGE]: I_UploadTypeConfig;\n [E_UploadType.VIDEO]: I_UploadTypeConfig;\n [E_UploadType.AUDIO]: I_UploadTypeConfig;\n [E_UploadType.DOCUMENT]: I_UploadTypeConfig;\n [E_UploadType.OTHER]: I_UploadTypeConfig;\n}\n\nexport interface I_UploadFileData {\n createReadStream: () => NodeJS.ReadableStream;\n filename: string;\n}\n\nexport interface I_UploadFile {\n file: I_UploadFileData;\n}\n\nexport interface I_UploadOptions {\n file: Promise<I_UploadFile>;\n path: string;\n type: E_UploadType;\n config?: I_UploadConfig;\n}\n"],"names":["E_UploadType"],"mappings":"AAAO,IAAKA,sBAAAA,OACRA,EAAA,QAAQ,SACRA,EAAA,QAAQ,SACRA,EAAA,QAAQ,SACRA,EAAA,WAAW,YACXA,EAAA,QAAQ,SALAA,IAAAA,KAAA,CAAA,CAAA;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.util.js","sources":["../../../src/node/upload/upload.util.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport { Transform } from 'node:stream';\nimport { ReadableStream } from 'node:stream/web';\n\nimport type { I_Return } from '#typescript/index.js';\n\nimport { RESPONSE_STATUS } from '#constant/index.js';\n\nimport type { I_UploadConfig, I_UploadFile, I_UploadFileData, I_UploadOptions, I_UploadTypeConfig, I_UploadValidationConfig } from './upload.type.js';\n\nimport { createWriteStream, mkdirSync, pathExistsSync } from '../fs/index.js';\nimport { dirname } from '../path/index.js';\nimport { BYTES_PER_MB, DEFAULT_UPLOAD_CONFIG } from './upload.constant.js';\nimport { E_UploadType } from './upload.type.js';\n\n/**\n * Calculates the size of a file from a readable stream.\n * This function reads through the entire stream to determine the total byte size\n * by accumulating the length of each data chunk.\n *\n * @param stream - The readable stream to calculate the size for.\n * @returns A promise that resolves to the total size of the stream in bytes.\n */\nexport async function getFileSizeFromStream(stream: NodeJS.ReadableStream): Promise<number> {\n return new Promise((resolve, reject) => {\n let size = 0;\n stream.on('data', (chunk) => {\n size += chunk.length;\n });\n stream.on('end', () => resolve(size));\n stream.on('error', reject);\n });\n}\n\n/**\n * Extracts and validates file data from an upload file.\n * This function processes upload files by:\n * - Extracting file metadata and creating a readable stream\n * - Calculating the file size from the stream\n * - Validating file size and extension against upload configuration\n * - Returning a standardized response with success status and error codes\n * - Providing validated file data for further processing\n *\n * @param type - The type of upload being processed (IMAGE, VIDEO, DOCUMENT, OTHER).\n * @param file - The upload file object containing file metadata and stream creation method.\n * @param config - Optional upload configuration. If not provided, uses default configuration.\n * @returns A promise that resolves to a standardized response containing validated file data or error information.\n */\nexport async function getAndValidateFile(type: E_UploadType, file: I_UploadFile, config?: I_UploadConfig): Promise<I_Return<I_UploadFileData>> {\n const fileData = await (await file).file;\n const stream = fileData.createReadStream();\n const fileSize = await getFileSizeFromStream(stream);\n const uploadConfig = config ?? createUploadConfig();\n\n const validationResult = validateUpload(\n { filename: fileData.filename, fileSize },\n uploadConfig,\n type,\n );\n\n if (!validationResult.isValid) {\n return {\n success: false,\n message: validationResult.error || 'File validation failed',\n code: RESPONSE_STATUS.BAD_REQUEST.CODE,\n };\n }\n\n return {\n success: true,\n result: fileData,\n message: 'File validated successfully',\n };\n}\n\n/**\n * Creates a validated web-readable stream from an upload file with size validation.\n * This function processes file uploads for web environments by:\n * - Validating file data using getAndValidateFile function\n * - Creating a size validation transform stream to monitor upload progress\n * - Returning a web-compatible ReadableStream with real-time validation\n * - Providing standardized error responses for validation failures\n * - Wrapping the stream in a standardized response format\n *\n * @param type - The type of upload being processed (IMAGE, VIDEO, DOCUMENT, OTHER).\n * @param file - The upload file object containing file metadata and stream creation method.\n * @param config - Optional upload configuration. If not provided, uses default configuration.\n * @returns A promise that resolves to a standardized response containing either a web ReadableStream or error information.\n */\nexport async function getFileWebStream(type: E_UploadType, file: I_UploadFile, config?: I_UploadConfig): Promise<I_Return<ReadableStream<Uint8Array>>> {\n const uploadConfig = config ?? createUploadConfig();\n const typeConfig = uploadConfig[type];\n\n const fileData = await getAndValidateFile(type, file, config);\n\n if (!fileData.success) {\n return fileData;\n }\n\n const { createReadStream } = fileData.result;\n\n let remainingBytes = typeConfig.sizeLimit;\n\n const sizeValidationStream = new Transform({\n transform(chunk: Buffer, _enc: BufferEncoding, cb) {\n remainingBytes -= chunk.length;\n\n if (remainingBytes < 0) {\n cb(new Error(`File size exceeds limit of ${typeConfig.sizeLimit / BYTES_PER_MB}MB`));\n }\n else {\n cb(null, chunk);\n }\n },\n });\n const originalStream = createReadStream();\n const validatedStream = originalStream.pipe(sizeValidationStream);\n\n return {\n success: true,\n result: new ReadableStream<Uint8Array>({\n start(controller) {\n validatedStream.on('data', (chunk: Buffer | string) => {\n controller.enqueue(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);\n });\n validatedStream.on('end', () => controller.close());\n validatedStream.on('error', (err: unknown) => controller.error(err));\n },\n }),\n };\n}\n\n/**\n * Validates if a file has an allowed extension.\n * This function extracts the file extension from the filename and checks if it's\n * included in the list of allowed extensions (case-insensitive comparison).\n *\n * @param filename - The filename to check for valid extension.\n * @param allowedExtensions - An array of allowed file extensions (without dots).\n * @returns True if the file extension is allowed, false otherwise.\n */\nexport function validateFileExtension(filename: string, allowedExtensions: string[]): boolean {\n const lastDotIndex = filename.lastIndexOf('.');\n\n if (lastDotIndex === -1) {\n return false;\n }\n\n const extension = filename.substring(lastDotIndex + 1).toLowerCase();\n\n return allowedExtensions.includes(extension);\n}\n\n/**\n * Validates an upload against the specified configuration.\n * This function performs comprehensive validation including:\n * - File extension validation against allowed extensions\n * - File size validation against size limits\n * - Returns detailed error messages for validation failures\n *\n * @param config - The validation configuration including filename and optional file size.\n * @param uploadConfig - The upload configuration containing allowed extensions and size limits.\n * @param uploadType - The type of upload being validated.\n * @returns An object indicating validation success and optional error message.\n */\nexport function validateUpload(\n config: I_UploadValidationConfig,\n uploadConfig: I_UploadConfig,\n uploadType: E_UploadType,\n): { isValid: boolean; error?: string } {\n const { filename, fileSize } = config;\n const typeConfig: I_UploadTypeConfig = uploadConfig[uploadType];\n\n const { allowedExtensions, sizeLimit } = typeConfig;\n\n if (!validateFileExtension(filename, allowedExtensions)) {\n return {\n isValid: false,\n error: `File extension not allowed for ${uploadType.toLowerCase()} files. Allowed extensions: ${allowedExtensions.join(', ')}`,\n };\n }\n\n if (fileSize !== undefined && fileSize > sizeLimit) {\n const maxSizeMB = Math.round(sizeLimit / (1024 * 1024));\n\n return {\n isValid: false,\n error: `File size exceeds limit for ${uploadType.toLowerCase()} files. Maximum size: ${maxSizeMB}MB`,\n };\n }\n\n return { isValid: true };\n}\n\n/**\n * Creates a default upload configuration with predefined settings for different file types.\n * This function provides sensible defaults for image, video, document, and other file types,\n * including allowed extensions and size limits. The configuration can be customized with overrides.\n *\n * @param overrides - Optional configuration overrides to merge with the default configuration.\n * @returns A complete upload configuration object with defaults and any provided overrides.\n */\nexport function createUploadConfig(overrides?: Partial<I_UploadConfig>): I_UploadConfig {\n return { ...DEFAULT_UPLOAD_CONFIG, ...overrides };\n}\n\n/**\n * Uploads a file with comprehensive validation and error handling.\n * This function processes file uploads with the following features:\n * - Input validation for path and file parameters\n * - Configuration validation for all upload types\n * - File validation using getAndValidateFile function\n * - Automatic directory creation\n * - Stream-based file writing\n * - Comprehensive error handling with standardized response codes\n *\n * @param options - Upload configuration including file, path, type, and optional validation config.\n * @returns A promise that resolves to a standardized response with success status, message, file path, and response codes.\n */\nexport async function upload(options: I_UploadOptions): Promise<I_Return<string>> {\n const { path, file, config, type } = options;\n\n if (!path || typeof path !== 'string') {\n return {\n success: false,\n message: 'Invalid path provided',\n code: RESPONSE_STATUS.BAD_REQUEST.CODE,\n };\n }\n\n if (!file || typeof file !== 'object') {\n return {\n success: false,\n message: 'Invalid file provided',\n code: RESPONSE_STATUS.BAD_REQUEST.CODE,\n };\n }\n\n if (config) {\n const requiredTypes = [E_UploadType.IMAGE, E_UploadType.VIDEO, E_UploadType.DOCUMENT, E_UploadType.OTHER];\n\n for (const requiredType of requiredTypes) {\n if (!config[requiredType] || !Array.isArray(config[requiredType].allowedExtensions) || config[requiredType].allowedExtensions.length === 0) {\n return {\n success: false,\n message: `Invalid config for ${requiredType.toLowerCase()} files`,\n code: RESPONSE_STATUS.BAD_REQUEST.CODE,\n };\n }\n if (typeof config[requiredType].sizeLimit !== 'number' || config[requiredType].sizeLimit <= 0) {\n return {\n success: false,\n message: `Invalid size limit for ${requiredType.toLowerCase()} files`,\n code: RESPONSE_STATUS.BAD_REQUEST.CODE,\n };\n }\n }\n }\n\n try {\n const fileData = await getAndValidateFile(type, await file, config);\n\n if (!fileData.success) {\n return fileData;\n }\n\n const { createReadStream } = fileData.result;\n\n const dir = dirname(path);\n\n if (!pathExistsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const writeStream = createReadStream();\n const out = createWriteStream(path);\n writeStream.pipe(out);\n\n await new Promise<void>((resolve, reject) => {\n out.on('finish', () => resolve());\n out.on('error', reject);\n writeStream.on('error', reject);\n });\n\n return {\n success: true,\n result: path,\n message: 'File uploaded successfully',\n code: RESPONSE_STATUS.OK.CODE,\n };\n }\n catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'File upload failed',\n code: RESPONSE_STATUS.INTERNAL_SERVER_ERROR.CODE,\n };\n }\n}\n"],"names":["getFileSizeFromStream","stream","resolve","reject","size","chunk","getAndValidateFile","type","file","config","fileData","fileSize","uploadConfig","createUploadConfig","validationResult","validateUpload","RESPONSE_STATUS","getFileWebStream","typeConfig","createReadStream","remainingBytes","sizeValidationStream","Transform","_enc","cb","BYTES_PER_MB","validatedStream","ReadableStream","controller","Buffer","err","validateFileExtension","filename","allowedExtensions","lastDotIndex","extension","uploadType","sizeLimit","maxSizeMB","overrides","DEFAULT_UPLOAD_CONFIG","upload","options","path","requiredTypes","E_UploadType","requiredType","dir","dirname","pathExistsSync","mkdirSync","writeStream","out","createWriteStream","error"],"mappings":"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"}
|
package/dist/node/ws/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './ws.util.js';
|
|
2
2
|
export * from './ws.type.js';
|
package/dist/node/ws/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ws.util.js","sources":["../../../src/node/ws/ws.util.ts"],"sourcesContent":["import type { Request, Response } from 'express';\nimport type { Buffer } from 'node:buffer';\nimport type { IncomingMessage } from 'node:http';\nimport type { Duplex } from 'node:stream';\n\nimport { useServer as createGraphQLWSServer } from 'graphql-ws/use/ws';\nimport { WebSocketServer } from 'ws';\n\nimport type { I_GraphqlWSOptions, I_WSOptions } from './ws.type.js';\n\n/**\n * Creates a WebSocket server with the specified configuration.\n * This function creates a WebSocket server instance that can be attached to an HTTP server\n * and configured with a specific path for WebSocket connections.\n *\n * @param options - Configuration options including the HTTP server instance and WebSocket path.\n * @returns A configured WebSocket server instance ready to handle connections.\n */\nexport function createWSServer(options: I_WSOptions): WebSocketServer {\n const { server, path, sessionParser } = options;\n\n if (sessionParser) {\n const wss = new WebSocketServer({ noServer: true });\n\n server.on('upgrade', (req: IncomingMessage, socket: Duplex, head: Buffer) => {\n try {\n const url = new URL(req.url || '', 'http://localhost');\n if (url.pathname !== path)\n return;\n\n sessionParser(req as Request, {} as Response, () => {\n wss.handleUpgrade(req, socket, head, (ws) => {\n wss.emit('connection', ws, req);\n });\n });\n }\n catch {\n socket.destroy();\n }\n });\n\n return wss;\n }\n\n return new WebSocketServer({ server, path });\n}\n\n/**\n * Initializes GraphQL WebSocket server with schema and WebSocket server.\n * This function sets up GraphQL subscriptions over WebSocket by creating a GraphQL WebSocket server\n * that can handle GraphQL operations including queries, mutations, and subscriptions.\n *\n * @param options - Configuration options including the GraphQL schema and WebSocket server instance.\n * @returns A configured GraphQL WebSocket server ready to handle GraphQL operations over WebSocket.\n */\nexport function initGraphQLWS(options: I_GraphqlWSOptions) {\n const { schema, server, context: makeExtraContext, onConnect } = options;\n\n return createGraphQLWSServer(\n {\n schema,\n context: async (ctx) => {\n const req = ctx.extra.request as IncomingMessage & { session?: any; user?: any };\n\n const extra = makeExtraContext ? await makeExtraContext(req) : {};\n return { req, ...extra };\n },\n onConnect: async (ctx) => {\n if (onConnect) {\n const req = ctx.extra.request as IncomingMessage & { session?: any; user?: any };\n await onConnect(req);\n }\n },\n },\n server,\n );\n}\n"],"names":["createWSServer","options","server","path","sessionParser","wss","WebSocketServer","req","socket","head","ws","initGraphQLWS","schema","makeExtraContext","onConnect","createGraphQLWSServer","ctx","extra"],"mappings":";;AAkBO,SAASA,EAAeC,GAAuC;AAClE,QAAM,EAAE,QAAAC,GAAQ,MAAAC,GAAM,eAAAC,EAAA,IAAkBH;AAExC,MAAIG,GAAe;AACf,UAAMC,IAAM,IAAIC,EAAgB,EAAE,UAAU,IAAM;AAElD,WAAAJ,EAAO,GAAG,WAAW,CAACK,GAAsBC,GAAgBC,MAAiB;AACzE,UAAI;AAEA,YADY,IAAI,IAAIF,EAAI,OAAO,IAAI,kBAAkB,EAC7C,aAAaJ;AACjB;AAEJ,QAAAC,EAAcG,GAAgB,CAAA,GAAgB,MAAM;AAChD,UAAAF,EAAI,cAAcE,GAAKC,GAAQC,GAAM,CAACC,MAAO;AACzC,YAAAL,EAAI,KAAK,cAAcK,GAAIH,CAAG;AAAA,UAClC,CAAC;AAAA,QACL,CAAC;AAAA,MACL,QACM;AACF,QAAAC,EAAO,QAAA;AAAA,MACX;AAAA,IACJ,CAAC,GAEMH;AAAA,EACX;AAEA,SAAO,IAAIC,EAAgB,EAAE,QAAAJ,GAAQ,MAAAC,GAAM;AAC/C;AAUO,SAASQ,EAAcV,GAA6B;AACvD,QAAM,EAAE,QAAAW,GAAQ,QAAAV,GAAQ,SAASW,GAAkB,WAAAC,MAAcb;AAEjE,SAAOc;AAAAA,IACH;AAAA,MACI,QAAAH;AAAA,MACA,SAAS,OAAOI,MAAQ;AACpB,cAAMT,IAAMS,EAAI,MAAM,SAEhBC,IAAQJ,IAAmB,MAAMA,EAAiBN,CAAG,IAAI,CAAA;AAC/D,eAAO,EAAE,KAAAA,GAAK,GAAGU,EAAA;AAAA,MACrB;AAAA,MACA,WAAW,OAAOD,MAAQ;AACtB,YAAIF,GAAW;AACX,gBAAMP,IAAMS,EAAI,MAAM;AACtB,gBAAMF,EAAUP,CAAG;AAAA,QACvB;AAAA,MACJ;AAAA,IAAA;AAAA,IAEJL;AAAA,EAAA;AAER;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../../../../../node_modules/.pnpm/vitest@4.0.18_@types+node@25.3.3_jiti@2.6.1_jsdom@28.1.0_@noble+hashes@1.8.0__sass@1.97.3_tsx@4.21.0_yaml@2.8.2/node_modules/vitest/dist/config.js"],"sourcesContent":["export { c as configDefaults, a as coverageConfigDefaults, d as defaultExclude, b as defaultInclude } from './chunks/defaults.BOqNVLsY.js';\nexport { mergeConfig } from 'vite';\nexport { d as defaultBrowserPort } from './chunks/constants.D_Q9UYh-.js';\nimport 'node:os';\nimport './chunks/env.D4Lgay0q.js';\nimport 'std-env';\n\nfunction defineConfig(config) {\n\treturn config;\n}\nfunction defineProject(config) {\n\treturn config;\n}\n\nexport { defineConfig, defineProject };\n"],"names":["defineConfig","config"],"mappings":"AAOA,SAASA,EAAaC,GAAQ;AAC7B,SAAOA;AACR;","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo-client.component.js","sources":["../../../src/react/apollo-client/apollo-client.component.tsx"],"sourcesContent":["import { ApolloProvider as ApolloProviderDefault } from '@apollo/client/react';\nimport * as React from 'react';\nimport { useMemo } from 'react';\n\nimport type { I_ApolloProviderProps } from './apollo-client.type.js';\n\nimport { ApolloErrorComponent, ApolloErrorProvider } from '../apollo-error/index.js';\nimport { Toaster } from '../toast/index.js';\nimport { ApolloClientProvider } from './apollo-client.context.js';\nimport { getClient } from './apollo-client.util.js';\n\n/**\n * Apollo Provider component that wraps the application with Apollo Client context.\n * This component provides the Apollo Client instance to all child components,\n * enabling GraphQL operations throughout the component tree. It includes\n * error handling and toast integration for a complete GraphQL experience.\n *\n * Features:\n * - Apollo Client context provision\n * - Error boundary integration\n * - Toast notification support\n * - Automatic error handling\n * - Development and production optimizations\n *\n * @param props - Component props containing options, children, and optional error override.\n * @param props.options - Apollo Client configuration options.\n * @param props.children - React children that will have access to Apollo Client context.\n * @param props.onError - Optional callback to override the default modal/toast error handling.\n * @returns A React component that provides Apollo Client context to its children.\n */\nexport function ApolloProvider({ options, children, onError }: I_ApolloProviderProps) {\n const client = useMemo(\n () => getClient(options ?? {}),\n [options],\n );\n\n return (\n <>\n <ApolloErrorProvider onError={onError}>\n <ApolloClientProvider client={client}>\n <ApolloProviderDefault client={client}>{children}</ApolloProviderDefault>\n </ApolloClientProvider>\n {!onError && <ApolloErrorComponent />}\n </ApolloErrorProvider>\n <Toaster position=\"top-right\" />\n </>\n );\n}\n"],"names":["ApolloProvider","options","children","onError","client","useMemo","getClient","React","ApolloErrorProvider","ApolloClientProvider","ApolloProviderDefault","ApolloErrorComponent","Toaster"],"mappings":";;;;;;;;AA8BO,SAASA,EAAe,EAAE,SAAAC,GAAS,UAAAC,GAAU,SAAAC,KAAkC;AAClF,QAAMC,IAASC;AAAA,IACX,MAAMC,EAAUL,KAAW,EAAE;AAAA,IAC7B,CAACA,CAAO;AAAA,EAAA;AAGZ,SACI,gBAAAM,EAAA,cAAAA,EAAA,UAAA,sCACKC,GAAA,EAAoB,SAAAL,EAAA,mCAChBM,GAAA,EAAqB,QAAAL,EAAA,GAClB,gBAAAG,EAAA,cAACG,GAAA,EAAsB,QAAAN,EAAA,GAAiBF,CAAS,CACrD,GACC,CAACC,KAAW,gBAAAI,EAAA,cAACI,GAAA,IAAqB,CACvC,GACA,gBAAAJ,EAAA,cAACK,GAAA,EAAQ,UAAS,YAAA,CAAY,CAClC;AAER;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo-client.constant.js","sources":["../../../src/react/apollo-client/apollo-client.constant.ts"],"sourcesContent":["/**\n * Default GraphQL endpoint URI for Apollo Client configuration.\n * This constant provides the standard GraphQL endpoint path that is commonly used\n * in web applications for GraphQL API communication.\n */\nexport const GRAPHQL_URI_DEFAULT = '/graphql';\n"],"names":["GRAPHQL_URI_DEFAULT"],"mappings":"AAKO,MAAMA,IAAsB;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo-client.context.js","sources":["../../../src/react/apollo-client/apollo-client.context.tsx"],"sourcesContent":["import type { ApolloClient } from '@apollo/client';\n\nimport * as React from 'react';\nimport { createContext } from 'react';\n\n/**\n * React context for providing Apollo Client instance to child components.\n * This context allows components to access the Apollo Client instance without\n * prop drilling, enabling direct access to client methods and cache operations.\n */\nconst ApolloClientContext = createContext<ApolloClient | null>(null);\n\n/**\n * Provider component that makes Apollo Client available to the component tree.\n * This component wraps the Apollo Client instance in a React context, allowing\n * any child component to access the client using the useApolloClient hook.\n *\n * @param props - Component props containing client and children.\n * @param props.client - The Apollo Client instance to provide to the component tree.\n * @param props.children - React children that will have access to the Apollo Client context.\n * @returns A React component that provides Apollo Client context to its children.\n */\nexport function ApolloClientProvider({\n client,\n children,\n}: {\n client: ApolloClient;\n children: React.ReactNode;\n}) {\n return (\n <ApolloClientContext value={client}>\n {children}\n </ApolloClientContext>\n );\n}\n\nexport { ApolloClientContext };\n"],"names":["React","createContext","ApolloClientContext","ApolloClientProvider","client","children"],"mappings":"AAUA,YAAAA,OAAA;AAAA,SAAA,iBAAAC,SAAA;AAAA,MAAMC,IAAsBD,EAAmC,IAAI;AAY5D,SAASE,EAAqB;AAAA,EACjC,QAAAC;AAAA,EACA,UAAAC;AACJ,GAGG;AACC,SACI,gBAAAL,EAAA,cAACE,GAAA,EAAoB,OAAOE,EAAA,GACvBC,CACL;AAER;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo-client.module.scss.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apollo-client.util.js","sources":["../../../src/react/apollo-client/apollo-client.util.tsx"],"sourcesContent":["import { ApolloClient, CombinedGraphQLErrors, CombinedProtocolErrors, InMemoryCache, ServerError } from '@apollo/client/core';\nimport { ApolloLink } from '@apollo/client/link';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { RemoveTypenameFromVariablesLink } from '@apollo/client/link/remove-typename';\nimport { GraphQLWsLink } from '@apollo/client/link/subscriptions';\nimport { OperationTypeNode } from 'graphql';\nimport { createClient } from 'graphql-ws';\nimport * as React from 'react';\nimport { tap } from 'rxjs';\n\nimport type { I_ApolloOptions } from './apollo-client.type.js';\n\nimport { hasCustomApolloErrorHandler, showGlobalApolloError } from '../apollo-error/index.js';\nimport { log } from '../log/index.js';\nimport { toast } from '../toast/index.js';\nimport { GRAPHQL_URI_DEFAULT } from './apollo-client.constant.js';\nimport styles from './apollo-client.module.scss';\nimport { createUploadLink } from './links/index.js';\n\nconst roundTripLink = new ApolloLink((operation, forward) => {\n operation.setContext({ start: new Date() });\n\n return forward(operation).pipe(\n tap(() => {\n const time = new Date().getTime() - operation.getContext()['start'];\n\n log.info(`Operation ${operation.operationName} took ${time}ms to complete`);\n }),\n );\n});\n\nconst errorLink = new ErrorLink(({ error, operation }) => {\n const opName = operation?.operationName || 'Unknown';\n let errorMessage = '';\n\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach(({ message, locations, path }, index) => {\n if (index === 0) {\n errorMessage = message;\n }\n\n log.error(\n `[GraphQL error] ${opName}: ${message}, Location: ${JSON.stringify(locations, null, 4)}, Path: ${path}`,\n );\n });\n }\n else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach(({ message, extensions }, index) => {\n if (index === 0) {\n errorMessage = message;\n }\n\n log.error(\n `[Protocol error]: ${message}, Extensions: ${JSON.stringify(extensions, null, 4)}`,\n );\n });\n }\n else if (ServerError.is(error)) {\n errorMessage = error.message;\n\n log.error(`[Server error]: ${error.message}`);\n }\n else {\n errorMessage = error.message;\n\n log.error(`[Network error]: ${error.message}`);\n }\n\n if (error && errorMessage && typeof window !== 'undefined') {\n if (hasCustomApolloErrorHandler()) {\n showGlobalApolloError(error);\n }\n else {\n toast.error((t: { id: string }) => (\n <div className={styles['error-container']}>\n {errorMessage}\n <button\n type=\"button\"\n className={styles['error-details-button']}\n onClick={() => {\n showGlobalApolloError(error);\n\n toast.dismiss(t.id);\n }}\n >\n Error Details\n </button>\n </div>\n ));\n }\n }\n});\n\n/**\n * Creates a comprehensive Apollo Link chain with all necessary middleware.\n * This function sets up a complete Apollo Link chain including error handling,\n * logging, file uploads, WebSocket subscriptions, and custom links. The chain\n * is configured to handle both HTTP and WebSocket operations with proper routing.\n *\n * The link chain includes:\n * - Development logging for operation tracking\n * - Error handling with user-friendly notifications\n * - Type name removal for cleaner requests\n * - File upload support\n * - WebSocket subscription support\n * - Custom link integration\n *\n * @param options - Configuration options for the Apollo Client including URI, WebSocket URL, and custom links.\n * @returns An array of Apollo Links configured for the specified options.\n */\nexport function createApolloLinks(options: I_ApolloOptions): ApolloLink[] {\n const { uri, wsUrl, customLinks } = options;\n\n const removeTypenameLink = new RemoveTypenameFromVariablesLink();\n\n if (!uri) {\n log.warn(`[Apollo] No GraphQL URI provided — using \"${GRAPHQL_URI_DEFAULT}\" as default`);\n }\n\n const uploadLink = createUploadLink({\n uri: uri ?? GRAPHQL_URI_DEFAULT,\n credentials: 'include',\n headers: {\n 'apollo-require-preflight': 'true',\n },\n });\n\n const wsLink = wsUrl\n ? new GraphQLWsLink(createClient({ url: wsUrl }))\n : ApolloLink.empty();\n\n const splitLink = wsUrl\n ? ApolloLink.split(\n ({ operationType }) => {\n return operationType === OperationTypeNode.SUBSCRIPTION;\n },\n wsLink,\n uploadLink as unknown as ApolloLink,\n )\n : uploadLink;\n\n if (wsUrl && splitLink === uploadLink) {\n log.warn('[Apollo] WS URL is set, but subscriptions fallback to HTTP. Check your wsLink config.');\n }\n\n return [\n roundTripLink,\n errorLink,\n removeTypenameLink,\n ...(customLinks ?? []),\n splitLink as unknown as ApolloLink,\n ];\n}\n\n/**\n * Creates a fully configured Apollo Client instance.\n * This function creates an Apollo Client with all necessary configuration including\n * the link chain, cache, and any additional options provided. The client is ready\n * for immediate use in React applications with comprehensive error handling and\n * development tooling.\n *\n * @param options - Configuration options for the Apollo Client including links, cache, and other settings.\n * @returns A fully configured Apollo Client instance ready for use.\n */\nexport function getClient(options: I_ApolloOptions) {\n const link = ApolloLink.from(createApolloLinks(options));\n\n return new ApolloClient({\n link,\n cache: new InMemoryCache(),\n ...options,\n });\n}\n"],"names":["roundTripLink","ApolloLink","operation","forward","tap","time","log","errorLink","ErrorLink","error","opName","errorMessage","CombinedGraphQLErrors","message","locations","path","index","CombinedProtocolErrors","extensions","ServerError","hasCustomApolloErrorHandler","showGlobalApolloError","toast","t","React","styles","createApolloLinks","options","uri","wsUrl","customLinks","removeTypenameLink","RemoveTypenameFromVariablesLink","GRAPHQL_URI_DEFAULT","uploadLink","createUploadLink","wsLink","GraphQLWsLink","createClient","splitLink","operationType","OperationTypeNode","getClient","link","ApolloClient","InMemoryCache"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sources":["../../../../src/react/apollo-client/links/upload.tsx"],"sourcesContent":["import type { BaseHttpLink } from '@apollo/client/link/http';\nimport type { ExtractableFile } from 'extract-files/isExtractableFile.mjs';\n\nimport { ApolloLink } from '@apollo/client/link';\nimport { defaultPrinter, fallbackHttpConfig, parseAndCheckHttpResponse, rewriteURIForGET, selectHttpOptionsAndBodyInternal, selectURI } from '@apollo/client/link/http';\nimport { Observable } from '@apollo/client/utilities';\nimport extractFiles from 'extract-files/extractFiles.mjs';\nimport isExtractableFile from 'extract-files/isExtractableFile.mjs';\n\n/**\n * Creates a signal if supported.\n * @returns {boolean} Signal if supported.\n */\nfunction createSignalIfSupported() {\n if (typeof AbortController === 'undefined') {\n return { controller: false, signal: false };\n }\n\n const controller = new AbortController();\n const signal = controller.signal;\n\n return { controller, signal };\n}\n\n/**\n * Appends a file to the form data.\n * @param {FormData} formData Form data to append the file to.\n * @param {string} fieldName Field name to append the file to.\n * @param {ExtractableFile} file File to append.\n */\nfunction formDataAppendFile(formData: FormData, fieldName: string, file: ExtractableFile) {\n 'name' in file\n ? formData.append(fieldName, file, file.name)\n : formData.append(fieldName, file);\n}\n\n/**\n * Creates a\n * [terminating Apollo Link](https://www.apollographql.com/docs/react/api/link/introduction/#the-terminating-link)\n * for [Apollo Client](https://www.apollographql.com/docs/react) that fetches a\n * [GraphQL multipart request](https://github.com/jaydenseric/graphql-multipart-request-spec)\n * if the GraphQL variables contain files (by default\n * [`FileList`](https://developer.mozilla.org/en-US/docs/Web/API/FileList),\n * [`File`](https://developer.mozilla.org/en-US/docs/Web/API/File), or\n * [`Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) instances),\n * or else fetches a regular\n * [GraphQL POST or GET request](https://www.apollographql.com/docs/apollo-server/workflow/requests)\n * (depending on the config and GraphQL operation).\n *\n * Some of the options are similar to the\n * [`createHttpLink` options](https://www.apollographql.com/docs/react/api/link/apollo-link-http/#httplink-constructor-options).\n * @see [GraphQL multipart request spec](https://github.com/jaydenseric/graphql-multipart-request-spec).\n * @param {object} options Options.\n * @param {Parameters<typeof selectURI>[1]} [options.uri] GraphQL endpoint URI.\n * Defaults to `\"/graphql\"`.\n * @param {boolean} [options.useGETForQueries] Should GET be used to fetch\n * queries, if there are no files to upload.\n * @param {ExtractableFileMatcher} [options.isExtractableFile] Matches\n * extractable files in the GraphQL operation. Defaults to\n * {@linkcode isExtractableFile}.\n * @param {typeof FormData} [options.FormData]\n * [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData)\n * class. Defaults to the {@linkcode FormData} global.\n * @param {FormDataFileAppender} [options.formDataAppendFile]\n * Customizes how extracted files are appended to the\n * [`FormData`](https://developer.mozilla.org/en-US/docs/Web/API/FormData)\n * instance. Defaults to {@linkcode formDataAppendFile}.\n * @param {import(\"@apollo/client/link/http/selectHttpOptionsAndBody.js\").Printer} [options.print]\n * Prints the GraphQL query or mutation AST to a string for transport.\n * Defaults to {@linkcode defaultPrinter}.\n * @param {typeof fetch} [options.fetch] [`fetch`](https://fetch.spec.whatwg.org)\n * implementation. Defaults to the {@linkcode fetch} global.\n * @param {RequestInit} [options.fetchOptions] `fetch` options; overridden by\n * upload requirements.\n * @param {string} [options.credentials] Overrides\n * {@linkcode RequestInit.credentials credentials} in\n * {@linkcode fetchOptions}.\n * @param {{ [headerName: string]: string }} [options.headers] Merges with and\n * overrides {@linkcode RequestInit.headers headers} in\n * {@linkcode fetchOptions}.\n * @param {boolean} [options.includeExtensions] Toggles sending `extensions`\n * fields to the GraphQL server. Defaults to `false`.\n * @returns A [terminating Apollo Link](https://www.apollographql.com/docs/react/api/link/introduction/#the-terminating-link).\n * @example\n * A basic Apollo Client setup:\n *\n * ```js\n * import { ApolloClient, InMemoryCache } from \"@apollo/client\";\n * import createUploadLink from \"apollo-upload-client/createUploadLink.mjs\";\n *\n * const client = new ApolloClient({\n * cache: new InMemoryCache(),\n * link: createUploadLink(),\n * });\n * ```\n */\nexport function createUploadLink({\n uri: fetchUri = '/graphql',\n useGETForQueries,\n isExtractableFile: customIsExtractableFile = isExtractableFile,\n FormData: CustomFormData,\n formDataAppendFile: customFormDataAppendFile = formDataAppendFile,\n print = defaultPrinter,\n fetch: customFetch,\n fetchOptions,\n credentials,\n headers,\n includeExtensions,\n}: {\n uri?: string;\n useGETForQueries?: boolean;\n isExtractableFile?: (value: unknown) => value is ExtractableFile;\n FormData?: typeof FormData;\n formDataAppendFile?: (formData: FormData, fieldName: string, file: ExtractableFile) => void;\n print?: BaseHttpLink.Printer;\n fetch?: typeof fetch;\n fetchOptions?: RequestInit;\n credentials?: RequestCredentials;\n headers?: Record<string, string>;\n includeExtensions?: boolean;\n} = {}) {\n const linkConfig = {\n http: { includeExtensions },\n options: fetchOptions,\n credentials,\n headers,\n };\n\n return new ApolloLink((operation) => {\n const context = (operation.getContext());\n const {\n // Apollo Studio client awareness `name` and `version` can be configured\n // via `ApolloClient` constructor options:\n // https://www.apollographql.com/docs/graphos/metrics/client-awareness/#setup\n clientAwareness: { name, version } = {},\n headers,\n } = context;\n\n const contextConfig = {\n http: context['http'],\n options: context['fetchOptions'],\n credentials: context['credentials'],\n headers: {\n // Client awareness headers can be overridden by context `headers`.\n ...(name && { 'apollographql-client-name': name }),\n ...(version && { 'apollographql-client-version': version }),\n ...headers,\n },\n };\n\n const { options, body } = selectHttpOptionsAndBodyInternal(\n operation,\n print,\n fallbackHttpConfig,\n linkConfig,\n contextConfig,\n );\n\n const { clone, files } = extractFiles(body, customIsExtractableFile, '');\n\n let uri = selectURI(operation, fetchUri);\n\n if (files.size) {\n if (options.headers)\n // Automatically set by `fetch` when the `body` is a `FormData` instance.\n delete options.headers['content-type'];\n\n // GraphQL multipart request spec:\n // https://github.com/jaydenseric/graphql-multipart-request-spec\n\n const RuntimeFormData = CustomFormData || FormData;\n\n const form = new RuntimeFormData();\n\n form.append('operations', JSON.stringify(clone));\n\n const map: Record<string, Array<string>> = {};\n\n let i = 0;\n files.forEach((paths) => {\n map[++i] = paths;\n });\n form.append('map', JSON.stringify(map));\n\n i = 0;\n files.forEach((_paths, file) => {\n customFormDataAppendFile(form, String(++i), file);\n });\n\n options['body'] = form;\n }\n else {\n if (\n useGETForQueries\n // If the operation contains some mutations GET shouldn’t be used.\n && !operation.query.definitions.some(\n definition =>\n definition.kind === 'OperationDefinition'\n && definition.operation === 'mutation',\n )\n ) {\n options['method'] = 'GET';\n }\n\n if (options['method'] === 'GET') {\n const { newURI, parseError } = rewriteURIForGET(uri, body);\n if (parseError) {\n // Apollo’s `HttpLink` uses `fromError` for this, but it’s not\n // exported from `@apollo/client/link/http`.\n return new Observable((observer) => {\n observer.error(parseError);\n });\n }\n uri = newURI;\n }\n else {\n options['body'] = JSON.stringify(clone);\n }\n }\n\n const { controller } = createSignalIfSupported();\n\n if (typeof controller !== 'boolean') {\n if (options['signal']) {\n // Respect the user configured abort controller signal.\n options['signal'].aborted\n // Signal already aborted, so immediately abort.\n ? controller.abort()\n // Signal not already aborted, so setup a listener to abort when it does.\n : options['signal'].addEventListener(\n 'abort',\n () => {\n controller.abort();\n },\n {\n // Prevent a memory leak if the user configured abort controller\n // is long lasting, or controls multiple things.\n once: true,\n },\n );\n }\n\n options['signal'] = controller.signal;\n }\n\n const runtimeFetch = customFetch || fetch;\n\n return new Observable((observer) => {\n /**\n * Is the observable being cleaned up.\n */\n let cleaningUp: boolean;\n\n runtimeFetch(uri, options)\n .then((response) => {\n // Forward the response on the context.\n operation.setContext({ response });\n return response;\n })\n .then(parseAndCheckHttpResponse(operation))\n .then((result) => {\n observer.next(result);\n observer.complete();\n })\n .catch((error) => {\n // If the observable is being cleaned up, there is no need to call\n // next or error because there are no more subscribers. An error after\n // cleanup begins is likely from the cleanup function aborting the\n // fetch.\n if (!cleaningUp) {\n // For errors such as an invalid fetch URI there will be no GraphQL\n // result with errors or data to forward.\n if (error.result && error.result.errors && error.result.data)\n observer.next(error.result);\n\n observer.error(error);\n }\n });\n\n // Cleanup function.\n return () => {\n cleaningUp = true;\n\n // Abort fetch. It’s ok to signal an abort even when not fetching.\n if (typeof controller !== 'boolean')\n controller.abort();\n };\n });\n });\n}\n"],"names":["ApolloLink","selectHttpOptionsAndBodyInternal","defaultPrinter","fallbackHttpConfig","selectURI","rewriteURIForGET","parseAndCheckHttpResponse","Observable","extractFiles","isExtractableFile","createSignalIfSupported","controller","signal","formDataAppendFile","formData","fieldName","file","createUploadLink","fetchUri","useGETForQueries","customIsExtractableFile","CustomFormData","customFormDataAppendFile","print","customFetch","fetchOptions","credentials","headers","includeExtensions","linkConfig","operation","context","name","version","contextConfig","options","body","clone","files","uri","RuntimeFormData","form","map","i","paths","_paths","definition","newURI","parseError","observer","runtimeFetch","cleaningUp","response","result","error"],"mappings":"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"}
|