target-supabase-sdk 0.1.9 → 0.2.1
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/README.md +184 -1
- package/dist/browser.d.ts +60 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +6 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunks/create-logger-DyH3mZ8p.js +1028 -0
- package/dist/chunks/create-logger-DyH3mZ8p.js.map +1 -0
- package/dist/chunks/enable-log-persist-C_bSw6Kx.js +1362 -0
- package/dist/chunks/enable-log-persist-C_bSw6Kx.js.map +1 -0
- package/dist/chunks/word.interface-DLgRobKV.js +1973 -0
- package/dist/chunks/word.interface-DLgRobKV.js.map +1 -0
- package/dist/command/command.api.d.ts +1 -1
- package/dist/command/command.api.d.ts.map +1 -1
- package/dist/command/command.interface.d.ts +1 -1
- package/dist/command/command.interface.d.ts.map +1 -1
- package/dist/core.api.d.ts +10 -6
- package/dist/core.api.d.ts.map +1 -1
- package/dist/core.interface.d.ts +3 -2
- package/dist/core.interface.d.ts.map +1 -1
- package/dist/core.utils.d.ts +1 -1
- package/dist/core.utils.d.ts.map +1 -1
- package/dist/idea/idea.interface.d.ts +1 -1
- package/dist/idea/idea.interface.d.ts.map +1 -1
- package/dist/index.d.ts +2 -48
- package/dist/index.d.ts.map +1 -1
- package/dist/link/link.api.d.ts +1 -1
- package/dist/link/link.api.d.ts.map +1 -1
- package/dist/link/link.interface.d.ts +3 -3
- package/dist/link/link.interface.d.ts.map +1 -1
- package/dist/list/list.api.d.ts +3 -1
- package/dist/list/list.api.d.ts.map +1 -1
- package/dist/list/list.interface.d.ts +2 -2
- package/dist/list/list.interface.d.ts.map +1 -1
- package/dist/node/env/env-parsers.d.ts +19 -0
- package/dist/node/env/env-parsers.d.ts.map +1 -0
- package/dist/node/env/index.d.ts +11 -0
- package/dist/node/env/index.d.ts.map +1 -0
- package/dist/node/env/init-supabase-from-env.d.ts +17 -0
- package/dist/node/env/init-supabase-from-env.d.ts.map +1 -0
- package/dist/node/env/load-env.d.ts +20 -0
- package/dist/node/env/load-env.d.ts.map +1 -0
- package/dist/node/env/project-root.d.ts +11 -0
- package/dist/node/env/project-root.d.ts.map +1 -0
- package/dist/node/env/public-base-url.d.ts +10 -0
- package/dist/node/env/public-base-url.d.ts.map +1 -0
- package/dist/node/env/require-env.d.ts +3 -0
- package/dist/node/env/require-env.d.ts.map +1 -0
- package/dist/node/fs/json-state-store.d.ts +19 -0
- package/dist/node/fs/json-state-store.d.ts.map +1 -0
- package/dist/node/fs/read-source-file.d.ts +19 -0
- package/dist/node/fs/read-source-file.d.ts.map +1 -0
- package/dist/node/node-liveness.d.ts +30 -0
- package/dist/node/node-liveness.d.ts.map +1 -0
- package/dist/node/node-runtime.base.d.ts +60 -0
- package/dist/node/node-runtime.base.d.ts.map +1 -0
- package/dist/node/node.api.d.ts +4 -4
- package/dist/node/node.api.d.ts.map +1 -1
- package/dist/node/node.interface.d.ts +1 -6
- package/dist/node/node.interface.d.ts.map +1 -1
- package/dist/node/preload/run-service-preload.d.ts +14 -0
- package/dist/node/preload/run-service-preload.d.ts.map +1 -0
- package/dist/node/preload/service-preload.interface.d.ts +15 -0
- package/dist/node/preload/service-preload.interface.d.ts.map +1 -0
- package/dist/node/process/index.d.ts +5 -0
- package/dist/node/process/index.d.ts.map +1 -0
- package/dist/node/process/managed-child-processes.d.ts +37 -0
- package/dist/node/process/managed-child-processes.d.ts.map +1 -0
- package/dist/node/process/process-spawn.d.ts +27 -0
- package/dist/node/process/process-spawn.d.ts.map +1 -0
- package/dist/node/readiness/index.d.ts +9 -0
- package/dist/node/readiness/index.d.ts.map +1 -0
- package/dist/node/readiness/poll-until.d.ts +11 -0
- package/dist/node/readiness/poll-until.d.ts.map +1 -0
- package/dist/node/readiness/readiness-checks.d.ts +22 -0
- package/dist/node/readiness/readiness-checks.d.ts.map +1 -0
- package/dist/node/readiness/readiness.types.d.ts +12 -0
- package/dist/node/readiness/readiness.types.d.ts.map +1 -0
- package/dist/node/readiness/run-readiness-checks.d.ts +4 -0
- package/dist/node/readiness/run-readiness-checks.d.ts.map +1 -0
- package/dist/node/readiness/service-ready-gate.d.ts +26 -0
- package/dist/node/readiness/service-ready-gate.d.ts.map +1 -0
- package/dist/node.d.ts +36 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +2483 -0
- package/dist/node.js.map +1 -0
- package/dist/parcel/chunk-fetch-registry.d.ts +14 -0
- package/dist/parcel/chunk-fetch-registry.d.ts.map +1 -0
- package/dist/parcel/chunk-url.utils.d.ts +9 -0
- package/dist/parcel/chunk-url.utils.d.ts.map +1 -0
- package/dist/parcel/parcel-manager.d.ts +44 -20
- package/dist/parcel/parcel-manager.d.ts.map +1 -1
- package/dist/parcel/parcel.api.d.ts +306 -0
- package/dist/parcel/parcel.api.d.ts.map +1 -0
- package/dist/parcel/parcel.interface.d.ts +26 -5
- package/dist/parcel/parcel.interface.d.ts.map +1 -1
- package/dist/parcel/parcel.service.d.ts +38 -0
- package/dist/parcel/parcel.service.d.ts.map +1 -0
- package/dist/parcel/storage-provider-registry.d.ts +17 -0
- package/dist/parcel/storage-provider-registry.d.ts.map +1 -0
- package/dist/parcel/storage-provider.types.d.ts +31 -0
- package/dist/parcel/storage-provider.types.d.ts.map +1 -0
- package/dist/preload.d.ts +7 -0
- package/dist/preload.d.ts.map +1 -0
- package/dist/preload.js +47 -0
- package/dist/preload.js.map +1 -0
- package/dist/repo/repo-context.utils.d.ts.map +1 -1
- package/dist/repo/repo-manager.d.ts +14 -3
- package/dist/repo/repo-manager.d.ts.map +1 -1
- package/dist/repo/repo.api.d.ts +1 -1
- package/dist/repo/repo.api.d.ts.map +1 -1
- package/dist/repo/repo.interface.d.ts +1 -1
- package/dist/repo/repo.interface.d.ts.map +1 -1
- package/dist/repo/repo.script-loader.d.ts +5 -5
- package/dist/repo/repo.script-loader.d.ts.map +1 -1
- package/dist/service/base.interface.d.ts +54 -57
- package/dist/service/base.interface.d.ts.map +1 -1
- package/dist/service/index.d.ts +21 -0
- package/dist/service/index.d.ts.map +1 -0
- package/dist/service/service.api.d.ts +503 -0
- package/dist/service/service.api.d.ts.map +1 -0
- package/dist/service/service.interface.d.ts +36 -9
- package/dist/service/service.interface.d.ts.map +1 -1
- package/dist/shared/http/fetch-retry.d.ts +21 -0
- package/dist/shared/http/fetch-retry.d.ts.map +1 -0
- package/dist/shared/log/create-logger.d.ts +27 -0
- package/dist/shared/log/create-logger.d.ts.map +1 -0
- package/dist/shared/log/enable-log-persist.d.ts +28 -0
- package/dist/shared/log/enable-log-persist.d.ts.map +1 -0
- package/dist/shared/log/index.d.ts +10 -0
- package/dist/shared/log/index.d.ts.map +1 -0
- package/dist/shared/log/log-manager.d.ts +37 -60
- package/dist/shared/log/log-manager.d.ts.map +1 -1
- package/dist/shared/log/log-persist-batch-id.d.ts +13 -0
- package/dist/shared/log/log-persist-batch-id.d.ts.map +1 -0
- package/dist/shared/log/log-persist-flush.d.ts +8 -0
- package/dist/shared/log/log-persist-flush.d.ts.map +1 -0
- package/dist/shared/log/log-persist-hook.d.ts +6 -0
- package/dist/shared/log/log-persist-hook.d.ts.map +1 -0
- package/dist/shared/log/log-persist-logger.d.ts +15 -0
- package/dist/shared/log/log-persist-logger.d.ts.map +1 -0
- package/dist/shared/log/log-persist-registry.d.ts +17 -0
- package/dist/shared/log/log-persist-registry.d.ts.map +1 -0
- package/dist/shared/log/log-persist.config.d.ts +10 -0
- package/dist/shared/log/log-persist.config.d.ts.map +1 -0
- package/dist/shared/log/log-persist.d.ts +55 -0
- package/dist/shared/log/log-persist.d.ts.map +1 -0
- package/dist/shared/log/log-persist.interface.d.ts +116 -0
- package/dist/shared/log/log-persist.interface.d.ts.map +1 -0
- package/dist/shared/log/log-scope.d.ts +56 -0
- package/dist/shared/log/log-scope.d.ts.map +1 -0
- package/dist/shared/utils/fetch-url.d.ts +3 -0
- package/dist/shared/utils/fetch-url.d.ts.map +1 -0
- package/dist/shared/utils/network-error.d.ts +14 -0
- package/dist/shared/utils/network-error.d.ts.map +1 -0
- package/dist/shared/utils/safe-file-name.d.ts +14 -0
- package/dist/shared/utils/safe-file-name.d.ts.map +1 -0
- package/dist/shared/utils/sha256.d.ts +3 -0
- package/dist/shared/utils/sha256.d.ts.map +1 -0
- package/dist/supabase.d.ts +7 -2
- package/dist/supabase.d.ts.map +1 -1
- package/dist/task/index.d.ts +16 -0
- package/dist/task/index.d.ts.map +1 -0
- package/dist/task/local-task-registry.d.ts +11 -1
- package/dist/task/local-task-registry.d.ts.map +1 -1
- package/dist/task/task-manager.d.ts +21 -11
- package/dist/task/task-manager.d.ts.map +1 -1
- package/dist/task/task-node.d.ts +19 -0
- package/dist/task/task-node.d.ts.map +1 -0
- package/dist/task/task-post-validated.api.d.ts +19 -0
- package/dist/task/task-post-validated.api.d.ts.map +1 -0
- package/dist/task/task-post.api.d.ts +54 -0
- package/dist/task/task-post.api.d.ts.map +1 -0
- package/dist/task/task-queue.d.ts +7 -0
- package/dist/task/task-queue.d.ts.map +1 -0
- package/dist/task/task-repo-context.d.ts +2 -0
- package/dist/task/task-repo-context.d.ts.map +1 -1
- package/dist/task/task-repo-validation.d.ts +46 -0
- package/dist/task/task-repo-validation.d.ts.map +1 -0
- package/dist/task/task.api.d.ts +5 -47
- package/dist/task/task.api.d.ts.map +1 -1
- package/dist/task/task.constant.d.ts +4 -0
- package/dist/task/task.constant.d.ts.map +1 -0
- package/dist/task/task.interface.d.ts +3 -1
- package/dist/task/task.interface.d.ts.map +1 -1
- package/dist/trigger/trigger-manager.d.ts +25 -0
- package/dist/trigger/trigger-manager.d.ts.map +1 -0
- package/dist/trigger/trigger-node.d.ts +23 -0
- package/dist/trigger/trigger-node.d.ts.map +1 -0
- package/dist/trigger/trigger.api.d.ts +140 -0
- package/dist/trigger/trigger.api.d.ts.map +1 -0
- package/dist/trigger/trigger.constant.d.ts +8 -0
- package/dist/trigger/trigger.constant.d.ts.map +1 -0
- package/dist/trigger/trigger.interface.d.ts +87 -0
- package/dist/trigger/trigger.interface.d.ts.map +1 -0
- package/dist/trigger/trigger.utils.d.ts +6 -0
- package/dist/trigger/trigger.utils.d.ts.map +1 -0
- package/dist/word/word.api.d.ts +1 -1
- package/dist/word/word.api.d.ts.map +1 -1
- package/dist/word/word.interface.d.ts +2 -2
- package/dist/word/word.interface.d.ts.map +1 -1
- package/package.json +91 -61
- package/src/browser.ts +165 -0
- package/src/command/command.api.ts +20 -18
- package/src/command/command.interface.ts +2 -3
- package/src/core.api.ts +466 -477
- package/src/core.interface.ts +63 -62
- package/src/core.utils.ts +64 -64
- package/src/idea/idea.interface.ts +3 -3
- package/src/index.ts +2 -79
- package/src/link/link.api.ts +28 -30
- package/src/link/link.interface.ts +4 -5
- package/src/list/list.api.ts +50 -29
- package/src/list/list.interface.ts +3 -4
- package/src/node/env/env-parsers.ts +77 -0
- package/src/node/env/index.ts +10 -0
- package/src/node/env/init-supabase-from-env.ts +38 -0
- package/src/node/env/load-env.ts +67 -0
- package/src/node/env/project-root.ts +34 -0
- package/src/node/env/public-base-url.ts +18 -0
- package/src/node/env/require-env.ts +15 -0
- package/src/node/fs/json-state-store.ts +97 -0
- package/src/node/fs/read-source-file.ts +75 -0
- package/src/node/node-liveness.ts +80 -0
- package/src/node/node-runtime.base.ts +481 -0
- package/src/node/node.api.ts +12 -11
- package/src/node/node.interface.ts +1 -8
- package/src/node/node.utils.ts +1 -1
- package/src/node/preload/run-service-preload.ts +48 -0
- package/src/node/preload/service-preload.interface.ts +14 -0
- package/src/node/process/index.ts +8 -0
- package/src/node/process/managed-child-processes.ts +121 -0
- package/src/node/process/process-spawn.ts +61 -0
- package/src/node/readiness/index.ts +20 -0
- package/src/node/readiness/poll-until.ts +27 -0
- package/src/node/readiness/readiness-checks.ts +79 -0
- package/src/node/readiness/readiness.types.ts +13 -0
- package/src/node/readiness/run-readiness-checks.ts +20 -0
- package/src/node/readiness/service-ready-gate.ts +65 -0
- package/src/node.ts +153 -0
- package/src/parcel/chunk-fetch-registry.ts +96 -0
- package/src/parcel/chunk-url.utils.ts +30 -0
- package/src/parcel/parcel-manager.ts +431 -173
- package/src/parcel/parcel.api.ts +103 -0
- package/src/parcel/parcel.interface.ts +44 -23
- package/src/parcel/parcel.service.ts +79 -0
- package/src/parcel/storage-provider-registry.ts +49 -0
- package/src/parcel/storage-provider.types.ts +45 -0
- package/src/preload.ts +7 -0
- package/src/repo/repo-context.utils.ts +3 -4
- package/src/repo/repo-manager.ts +54 -39
- package/src/repo/repo.api.ts +5 -5
- package/src/repo/repo.interface.ts +1 -2
- package/src/repo/repo.script-loader.ts +16 -20
- package/src/service/base.interface.ts +81 -90
- package/src/service/index.ts +173 -0
- package/src/service/service.api.ts +294 -0
- package/src/service/service.interface.ts +49 -17
- package/src/shared/http/fetch-retry.ts +145 -0
- package/src/shared/log/create-logger.ts +51 -0
- package/src/shared/log/enable-log-persist.ts +225 -0
- package/src/shared/log/index.ts +31 -0
- package/src/shared/log/log-manager.ts +112 -121
- package/src/shared/log/log-persist-batch-id.ts +43 -0
- package/src/shared/log/log-persist-flush.ts +128 -0
- package/src/shared/log/log-persist-hook.ts +13 -0
- package/src/shared/log/log-persist-logger.ts +33 -0
- package/src/shared/log/log-persist-registry.ts +109 -0
- package/src/shared/log/log-persist.config.ts +97 -0
- package/src/shared/log/log-persist.interface.ts +132 -0
- package/src/shared/log/log-persist.ts +704 -0
- package/src/shared/log/log-scope.ts +123 -0
- package/src/shared/utils/config-path.utils.ts +1 -1
- package/src/shared/utils/fetch-url.ts +13 -0
- package/src/shared/utils/network-error.ts +152 -0
- package/src/shared/utils/safe-file-name.ts +37 -0
- package/src/shared/utils/sha256.ts +15 -0
- package/src/supabase.ts +125 -119
- package/src/task/index.ts +45 -0
- package/src/task/local-task-registry.ts +115 -36
- package/src/task/task-manager.ts +101 -113
- package/src/task/task-node.ts +302 -0
- package/src/task/task-post-validated.api.ts +47 -0
- package/src/task/task-post.api.ts +99 -0
- package/src/task/task-queue.ts +18 -0
- package/src/task/task-repo-context.ts +4 -1
- package/src/task/task-repo-validation.ts +169 -0
- package/src/task/task.api.ts +68 -92
- package/src/task/task.constant.ts +4 -0
- package/src/task/task.interface.ts +6 -7
- package/src/trigger/trigger-manager.ts +287 -0
- package/src/trigger/trigger-node.ts +80 -0
- package/src/trigger/trigger.api.ts +166 -0
- package/src/trigger/trigger.constant.ts +10 -0
- package/src/trigger/trigger.interface.ts +100 -0
- package/src/trigger/trigger.utils.ts +56 -0
- package/src/word/word.api.ts +28 -30
- package/src/word/word.interface.ts +3 -4
- package/dist/auth/auth.api.d.ts +0 -28
- package/dist/auth/auth.api.d.ts.map +0 -1
- package/dist/auth/auth.api.js +0 -51
- package/dist/auth/auth.api.js.map +0 -1
- package/dist/command/command.api.js +0 -58
- package/dist/command/command.api.js.map +0 -1
- package/dist/command/command.interface.js +0 -9
- package/dist/command/command.interface.js.map +0 -1
- package/dist/core.api.js +0 -412
- package/dist/core.api.js.map +0 -1
- package/dist/core.interface.js +0 -46
- package/dist/core.interface.js.map +0 -1
- package/dist/core.utils.js +0 -81
- package/dist/core.utils.js.map +0 -1
- package/dist/feed/feed.interface.d.ts +0 -27
- package/dist/feed/feed.interface.d.ts.map +0 -1
- package/dist/feed/feed.interface.js +0 -17
- package/dist/feed/feed.interface.js.map +0 -1
- package/dist/file/file-manager.d.ts +0 -24
- package/dist/file/file-manager.d.ts.map +0 -1
- package/dist/file/file-manager.js +0 -109
- package/dist/file/file-manager.js.map +0 -1
- package/dist/file/file.api.d.ts +0 -15
- package/dist/file/file.api.d.ts.map +0 -1
- package/dist/file/file.api.js +0 -30
- package/dist/file/file.api.js.map +0 -1
- package/dist/file/file.interface.d.ts +0 -25
- package/dist/file/file.interface.d.ts.map +0 -1
- package/dist/file/file.interface.js +0 -9
- package/dist/file/file.interface.js.map +0 -1
- package/dist/file-list/file-list.api.d.ts +0 -15
- package/dist/file-list/file-list.api.d.ts.map +0 -1
- package/dist/file-list/file-list.api.js +0 -54
- package/dist/file-list/file-list.api.js.map +0 -1
- package/dist/file-list/file-list.interface.d.ts +0 -22
- package/dist/file-list/file-list.interface.d.ts.map +0 -1
- package/dist/file-list/file-list.interface.js +0 -5
- package/dist/file-list/file-list.interface.js.map +0 -1
- package/dist/idea/idea.interface.js +0 -15
- package/dist/idea/idea.interface.js.map +0 -1
- package/dist/index.js +0 -42
- package/dist/index.js.map +0 -1
- package/dist/link/link.api.js +0 -30
- package/dist/link/link.api.js.map +0 -1
- package/dist/link/link.interface.js +0 -7
- package/dist/link/link.interface.js.map +0 -1
- package/dist/list/list.api.js +0 -30
- package/dist/list/list.api.js.map +0 -1
- package/dist/list/list.interface.js +0 -6
- package/dist/list/list.interface.js.map +0 -1
- package/dist/node/node-manager.d.ts +0 -48
- package/dist/node/node-manager.d.ts.map +0 -1
- package/dist/node/node-manager.js +0 -619
- package/dist/node/node-manager.js.map +0 -1
- package/dist/node/node-task.preset.d.ts +0 -1
- package/dist/node/node-task.preset.d.ts.map +0 -1
- package/dist/node/node-task.preset.js +0 -14
- package/dist/node/node-task.preset.js.map +0 -1
- package/dist/node/node.api.js +0 -100
- package/dist/node/node.api.js.map +0 -1
- package/dist/node/node.interface.js +0 -19
- package/dist/node/node.interface.js.map +0 -1
- package/dist/node/node.utils.js +0 -36
- package/dist/node/node.utils.js.map +0 -1
- package/dist/parcel/parcel-manager.js +0 -156
- package/dist/parcel/parcel-manager.js.map +0 -1
- package/dist/parcel/parcel.interface.js +0 -11
- package/dist/parcel/parcel.interface.js.map +0 -1
- package/dist/question-list/question-list.api.d.ts +0 -13
- package/dist/question-list/question-list.api.d.ts.map +0 -1
- package/dist/question-list/question-list.api.js +0 -35
- package/dist/question-list/question-list.api.js.map +0 -1
- package/dist/question-list/question-list.interface.d.ts +0 -18
- package/dist/question-list/question-list.interface.d.ts.map +0 -1
- package/dist/question-list/question-list.interface.js +0 -5
- package/dist/question-list/question-list.interface.js.map +0 -1
- package/dist/repo/repo-context.utils.js +0 -81
- package/dist/repo/repo-context.utils.js.map +0 -1
- package/dist/repo/repo-manager.js +0 -156
- package/dist/repo/repo-manager.js.map +0 -1
- package/dist/repo/repo.api.js +0 -40
- package/dist/repo/repo.api.js.map +0 -1
- package/dist/repo/repo.interface.js +0 -8
- package/dist/repo/repo.interface.js.map +0 -1
- package/dist/repo/repo.script-loader.js +0 -108
- package/dist/repo/repo.script-loader.js.map +0 -1
- package/dist/review/review.api.d.ts +0 -14
- package/dist/review/review.api.d.ts.map +0 -1
- package/dist/review/review.api.js +0 -133
- package/dist/review/review.api.js.map +0 -1
- package/dist/review/review.interface.d.ts +0 -24
- package/dist/review/review.interface.d.ts.map +0 -1
- package/dist/review/review.interface.js +0 -10
- package/dist/review/review.interface.js.map +0 -1
- package/dist/review-v2/apis/post-review-setting.api.d.ts +0 -12
- package/dist/review-v2/apis/post-review-setting.api.d.ts.map +0 -1
- package/dist/review-v2/apis/post-review-setting.api.js +0 -27
- package/dist/review-v2/apis/post-review-setting.api.js.map +0 -1
- package/dist/review-v2/apis/post-review.api.d.ts +0 -13
- package/dist/review-v2/apis/post-review.api.d.ts.map +0 -1
- package/dist/review-v2/apis/post-review.api.js +0 -46
- package/dist/review-v2/apis/post-review.api.js.map +0 -1
- package/dist/review-v2/review-setting.interface.d.ts +0 -23
- package/dist/review-v2/review-setting.interface.d.ts.map +0 -1
- package/dist/review-v2/review-setting.interface.js +0 -5
- package/dist/review-v2/review-setting.interface.js.map +0 -1
- package/dist/review-v2/review.interface.d.ts +0 -20
- package/dist/review-v2/review.interface.d.ts.map +0 -1
- package/dist/review-v2/review.interface.js +0 -5
- package/dist/review-v2/review.interface.js.map +0 -1
- package/dist/service/api.interface.d.ts +0 -35
- package/dist/service/api.interface.d.ts.map +0 -1
- package/dist/service/api.interface.js +0 -12
- package/dist/service/api.interface.js.map +0 -1
- package/dist/service/base.interface.js +0 -7
- package/dist/service/base.interface.js.map +0 -1
- package/dist/service/service.interface.js +0 -11
- package/dist/service/service.interface.js.map +0 -1
- package/dist/shared/log/create-api-logger.d.ts +0 -17
- package/dist/shared/log/create-api-logger.d.ts.map +0 -1
- package/dist/shared/log/create-api-logger.js +0 -15
- package/dist/shared/log/create-api-logger.js.map +0 -1
- package/dist/shared/log/log-manager.js +0 -218
- package/dist/shared/log/log-manager.js.map +0 -1
- package/dist/shared/utils/config-path.utils.js +0 -85
- package/dist/shared/utils/config-path.utils.js.map +0 -1
- package/dist/shared/utils/error.utils.js +0 -15
- package/dist/shared/utils/error.utils.js.map +0 -1
- package/dist/shared/utils/id.utils.js +0 -5
- package/dist/shared/utils/id.utils.js.map +0 -1
- package/dist/supabase.js +0 -100
- package/dist/supabase.js.map +0 -1
- package/dist/task/local-task-registry.js +0 -153
- package/dist/task/local-task-registry.js.map +0 -1
- package/dist/task/task-manager.js +0 -217
- package/dist/task/task-manager.js.map +0 -1
- package/dist/task/task-repo-context.js +0 -12
- package/dist/task/task-repo-context.js.map +0 -1
- package/dist/task/task.api.js +0 -351
- package/dist/task/task.api.js.map +0 -1
- package/dist/task/task.interface.js +0 -36
- package/dist/task/task.interface.js.map +0 -1
- package/dist/task/task.utils.js +0 -2
- package/dist/task/task.utils.js.map +0 -1
- package/dist/word/word.api.js +0 -30
- package/dist/word/word.api.js.map +0 -1
- package/dist/word/word.interface.js +0 -6
- package/dist/word/word.interface.js.map +0 -1
- package/src/auth/auth.api.ts +0 -87
- package/src/feed/feed.interface.ts +0 -33
- package/src/file/file-manager.ts +0 -145
- package/src/file/file.api.ts +0 -43
- package/src/file/file.interface.ts +0 -30
- package/src/file-list/file-list.api.ts +0 -64
- package/src/file-list/file-list.interface.ts +0 -24
- package/src/node/node-manager.ts +0 -673
- package/src/node/node-task.preset.ts +0 -13
- package/src/question-list/question-list.api.ts +0 -42
- package/src/question-list/question-list.interface.ts +0 -21
- package/src/review/review.api.ts +0 -145
- package/src/review/review.interface.ts +0 -26
- package/src/review-v2/apis/post-review-setting.api.ts +0 -35
- package/src/review-v2/apis/post-review.api.ts +0 -59
- package/src/review-v2/review-setting.interface.ts +0 -26
- package/src/review-v2/review.interface.ts +0 -23
- package/src/service/api.interface.ts +0 -47
- package/src/shared/log/create-api-logger.ts +0 -25
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createTarget, deleteTarget, getTarget, validateWithSchema } from "../core.api";
|
|
3
|
+
import { CategoryParcel, type Parcel, type ParcelDetails } from "./parcel.interface";
|
|
4
|
+
|
|
5
|
+
const parcelIdSchema = z.string().trim().min(1);
|
|
6
|
+
|
|
7
|
+
const chunkSchema = z.object({
|
|
8
|
+
index: z.number().int().nonnegative(),
|
|
9
|
+
size: z.number().int().nonnegative(),
|
|
10
|
+
checksum: z.string().trim().min(1),
|
|
11
|
+
url: z.string().trim().min(1),
|
|
12
|
+
provider: z.string().optional(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const parcelCryptoSchema = z.object({
|
|
16
|
+
enabled: z.boolean(),
|
|
17
|
+
algorithm: z.string().optional(),
|
|
18
|
+
iv: z.string().optional(),
|
|
19
|
+
keyDerivation: z.string().optional(),
|
|
20
|
+
salt: z.string().optional(),
|
|
21
|
+
pbkdf2Iterations: z.number().int().positive().optional(),
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export const parcelDetailsSchema = z.object({
|
|
25
|
+
manifestVersion: z.number().int().nonnegative(),
|
|
26
|
+
chunkList: z.array(chunkSchema).min(1),
|
|
27
|
+
checksum: z.string().trim().min(1),
|
|
28
|
+
size: z.number().int().nonnegative(),
|
|
29
|
+
preview: z.string().optional(),
|
|
30
|
+
crypto: parcelCryptoSchema.optional(),
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
export const postParcelSchema = z.object({
|
|
34
|
+
name: z.string().trim().min(1),
|
|
35
|
+
value: z.string().trim().min(1),
|
|
36
|
+
details: parcelDetailsSchema,
|
|
37
|
+
tagList: z.array(z.string()).optional().default([]),
|
|
38
|
+
extra: z.string().optional(),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export type PostParcelPayload = z.infer<typeof postParcelSchema>;
|
|
42
|
+
|
|
43
|
+
export const getParcelSchema = z.object({
|
|
44
|
+
id: parcelIdSchema,
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export type GetParcelPayload = z.infer<typeof getParcelSchema>;
|
|
48
|
+
|
|
49
|
+
export const deleteParcelSchema = z.object({
|
|
50
|
+
id: parcelIdSchema,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
export type DeleteParcelPayload = z.infer<typeof deleteParcelSchema>;
|
|
54
|
+
|
|
55
|
+
const parcelCategoryFilter = {
|
|
56
|
+
field: "category",
|
|
57
|
+
operator: "eq" as const,
|
|
58
|
+
value: CategoryParcel.PARCEL,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/** Persist a Parcel row (`category=parcel`) after chunks are uploaded via {@link ParcelManager.save}. */
|
|
62
|
+
export const postParcel = validateWithSchema(
|
|
63
|
+
postParcelSchema,
|
|
64
|
+
"postParcelSchema",
|
|
65
|
+
)(async ({ name, value, details, tagList, extra }) => {
|
|
66
|
+
return createTarget<Parcel, PostParcelPayload>({
|
|
67
|
+
payload: { name, value, details, tagList, extra },
|
|
68
|
+
createFn: () => ({
|
|
69
|
+
name,
|
|
70
|
+
value,
|
|
71
|
+
category: CategoryParcel.PARCEL,
|
|
72
|
+
tagList,
|
|
73
|
+
extra,
|
|
74
|
+
details: details as ParcelDetails,
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/** Fetch a Parcel by id (`category=parcel`). */
|
|
80
|
+
export const getParcel = validateWithSchema(
|
|
81
|
+
getParcelSchema,
|
|
82
|
+
"getParcelSchema",
|
|
83
|
+
)(async ({ id }) => {
|
|
84
|
+
const result = await getTarget({
|
|
85
|
+
id,
|
|
86
|
+
filterList: [parcelCategoryFilter],
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
...result,
|
|
90
|
+
data: result.data as Parcel,
|
|
91
|
+
};
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
/** Delete a Parcel row by id (`category=parcel`). Does not remove chunk blobs from storage providers. */
|
|
95
|
+
export const deleteParcel = validateWithSchema(
|
|
96
|
+
deleteParcelSchema,
|
|
97
|
+
"deleteParcelSchema",
|
|
98
|
+
)(async ({ id }) => {
|
|
99
|
+
return deleteTarget({
|
|
100
|
+
id,
|
|
101
|
+
filterList: [parcelCategoryFilter],
|
|
102
|
+
});
|
|
103
|
+
});
|
|
@@ -1,40 +1,61 @@
|
|
|
1
|
-
import { Target } from "../core.interface";
|
|
1
|
+
import type { Target } from "../core.interface";
|
|
2
|
+
|
|
3
|
+
export enum CategoryParcel {
|
|
4
|
+
PARCEL = "parcel",
|
|
5
|
+
}
|
|
2
6
|
|
|
3
7
|
export interface Parcel extends Target {
|
|
4
|
-
|
|
5
|
-
|
|
8
|
+
/** Human readable name */
|
|
9
|
+
name: string;
|
|
10
|
+
/** Used to search the parcel, should be unique */
|
|
11
|
+
value: string;
|
|
12
|
+
category: CategoryParcel;
|
|
13
|
+
details: ParcelDetails;
|
|
6
14
|
}
|
|
7
15
|
|
|
8
|
-
export
|
|
9
|
-
|
|
16
|
+
export interface ParcelCrypto {
|
|
17
|
+
/** 未設置或 false → 明文分片 */
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
/** 例如 "AES-GCM-256";enabled 時必填 */
|
|
20
|
+
algorithm?: string;
|
|
21
|
+
/** Base64 IV;AES-GCM 時必填 */
|
|
22
|
+
iv?: string;
|
|
23
|
+
/** 口令派生密鑰時的 KDF,例如 "PBKDF2-SHA256" */
|
|
24
|
+
keyDerivation?: string;
|
|
25
|
+
/** PBKDF2 salt(Base64);keyDerivation 為 PBKDF2 時必填 */
|
|
26
|
+
salt?: string;
|
|
27
|
+
/** PBKDF2 迭代次數;未設置時由 SDK 默認 */
|
|
28
|
+
pbkdf2Iterations?: number;
|
|
10
29
|
}
|
|
11
30
|
|
|
12
31
|
export interface ParcelDetails {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
32
|
+
manifestVersion: number;
|
|
33
|
+
chunkList: Chunk[];
|
|
34
|
+
/** 還原後的明文 sha256 */
|
|
35
|
+
checksum: string;
|
|
36
|
+
/** 還原後的明文大小(字節) */
|
|
37
|
+
size: number;
|
|
38
|
+
preview?: string;
|
|
39
|
+
crypto?: ParcelCrypto;
|
|
18
40
|
}
|
|
19
41
|
|
|
20
42
|
export enum LifecycleStatus {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
43
|
+
STORED = "STORED",
|
|
44
|
+
SOFT_DELETED = "SOFT_DELETED",
|
|
45
|
+
HARD_DELETED = "HARD_DELETED",
|
|
24
46
|
}
|
|
25
47
|
|
|
26
48
|
export interface Lifecycle {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
49
|
+
status: LifecycleStatus;
|
|
50
|
+
storedAt: string;
|
|
51
|
+
softDeletedAt: string | null;
|
|
52
|
+
hardDeletedAt: string | null;
|
|
31
53
|
}
|
|
32
54
|
|
|
33
55
|
export interface Chunk {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
url: string;
|
|
56
|
+
index: number;
|
|
57
|
+
size: number;
|
|
58
|
+
checksum: string; // 該 chunk 字節的 sha256(明文或密文,與 create 時一致)
|
|
59
|
+
url: string;
|
|
60
|
+
provider?: string; // 對應 StorageAdapter / 平台標識(呼應 TODO shardKey)
|
|
40
61
|
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { SupabaseResponse } from "../core.interface";
|
|
2
|
+
import { getParcel, postParcel } from "./parcel.api";
|
|
3
|
+
import type { Parcel } from "./parcel.interface";
|
|
4
|
+
import { type CreateOptions, ParcelManager, type ReassembleOptions, type StorageAdapter } from "./parcel-manager";
|
|
5
|
+
|
|
6
|
+
export interface PublishParcelInput {
|
|
7
|
+
file: ArrayBuffer;
|
|
8
|
+
adapters: StorageAdapter[];
|
|
9
|
+
name: string;
|
|
10
|
+
value: string;
|
|
11
|
+
tagList?: string[];
|
|
12
|
+
extra?: string;
|
|
13
|
+
createOptions?: CreateOptions;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface PublishParcelResult {
|
|
17
|
+
parcel: Parcel;
|
|
18
|
+
/** Present when encrypted without passphrase — caller must persist outside Supabase */
|
|
19
|
+
key?: CryptoKey;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface RestoreParcelByIdInput {
|
|
23
|
+
id: string;
|
|
24
|
+
reassembleOptions?: ReassembleOptions;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface RestoreParcelByIdResult {
|
|
28
|
+
parcel: Parcel;
|
|
29
|
+
file: ArrayBuffer;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function requireResponseData<T>(response: SupabaseResponse<T>, label: string): T {
|
|
33
|
+
if (response.data == null) {
|
|
34
|
+
const suffix = response.message != null ? ` (${response.message})` : "";
|
|
35
|
+
throw new Error(`${label}: no data${suffix}`);
|
|
36
|
+
}
|
|
37
|
+
return response.data;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* One-shot publish: split (optional encrypt) → upload chunks → persist Parcel row.
|
|
42
|
+
* Orchestrates {@link ParcelManager} + {@link postParcel}.
|
|
43
|
+
*/
|
|
44
|
+
export async function publishParcel(input: PublishParcelInput): Promise<PublishParcelResult> {
|
|
45
|
+
const { file, adapters, name, value, tagList = [], extra, createOptions } = input;
|
|
46
|
+
|
|
47
|
+
const createResult = await ParcelManager.create(file, createOptions ?? {});
|
|
48
|
+
const draft = await ParcelManager.save(createResult, adapters, { name, value, tagList });
|
|
49
|
+
|
|
50
|
+
const response = await postParcel({
|
|
51
|
+
name: draft.name,
|
|
52
|
+
value: draft.value,
|
|
53
|
+
details: draft.details,
|
|
54
|
+
tagList: draft.tagList ?? [],
|
|
55
|
+
extra,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
parcel: requireResponseData(response, "postParcel"),
|
|
60
|
+
key: createResult.key,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Reassemble file bytes from a {@link Parcel} (chunk URLs in details).
|
|
66
|
+
*/
|
|
67
|
+
export async function restoreParcel(parcel: Parcel, reassembleOptions?: ReassembleOptions): Promise<ArrayBuffer> {
|
|
68
|
+
return ParcelManager.reassemble(parcel, reassembleOptions ?? {});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Fetch Parcel by id, then reassemble. Orchestrates {@link getParcel} + {@link restoreParcel}.
|
|
73
|
+
*/
|
|
74
|
+
export async function restoreParcelById(input: RestoreParcelByIdInput): Promise<RestoreParcelByIdResult> {
|
|
75
|
+
const response = await getParcel({ id: input.id });
|
|
76
|
+
const parcel = requireResponseData(response, "getParcel");
|
|
77
|
+
const file = await restoreParcel(parcel, input.reassembleOptions);
|
|
78
|
+
return { parcel, file };
|
|
79
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { registerProviderChunkResolver } from "./chunk-fetch-registry";
|
|
2
|
+
import type { ProviderProbeResult, StorageProviderModule } from "./storage-provider.types";
|
|
3
|
+
|
|
4
|
+
export type ProviderProbeMap = Record<string, ProviderProbeResult | { ok: true; detail: { skipped: true } }>;
|
|
5
|
+
|
|
6
|
+
export interface StorageProviderRegistry {
|
|
7
|
+
register(module: StorageProviderModule): void;
|
|
8
|
+
get(provider: string): StorageProviderModule;
|
|
9
|
+
has(provider: string): boolean;
|
|
10
|
+
list(): string[];
|
|
11
|
+
probeAll(): Promise<ProviderProbeMap>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** In-process registry for {@link StorageProviderModule}; syncs chunk resolvers on register. */
|
|
15
|
+
export function createStorageProviderRegistry(): StorageProviderRegistry {
|
|
16
|
+
const modules = new Map<string, StorageProviderModule>();
|
|
17
|
+
|
|
18
|
+
return {
|
|
19
|
+
register(module) {
|
|
20
|
+
modules.set(module.provider, module);
|
|
21
|
+
registerProviderChunkResolver(module);
|
|
22
|
+
},
|
|
23
|
+
get(provider) {
|
|
24
|
+
const found = modules.get(provider);
|
|
25
|
+
if (found == null) {
|
|
26
|
+
const available = [...modules.keys()].join(", ") || "(none)";
|
|
27
|
+
throw new Error(`Unknown storage provider: ${provider}. Registered: ${available}`);
|
|
28
|
+
}
|
|
29
|
+
return found;
|
|
30
|
+
},
|
|
31
|
+
has(provider) {
|
|
32
|
+
return modules.has(provider);
|
|
33
|
+
},
|
|
34
|
+
list() {
|
|
35
|
+
return [...modules.keys()];
|
|
36
|
+
},
|
|
37
|
+
async probeAll() {
|
|
38
|
+
const out: ProviderProbeMap = {};
|
|
39
|
+
for (const [name, module] of modules) {
|
|
40
|
+
if (module.probe == null) {
|
|
41
|
+
out[name] = { ok: true, detail: { skipped: true } };
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
out[name] = await module.probe();
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ChunkResolveProvider } from "./chunk-fetch-registry";
|
|
2
|
+
import type { Parcel } from "./parcel.interface";
|
|
3
|
+
import type { StorageAdapter } from "./parcel-manager";
|
|
4
|
+
|
|
5
|
+
export interface ProviderProbeOk {
|
|
6
|
+
ok: true;
|
|
7
|
+
detail?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ProviderProbeFail {
|
|
11
|
+
ok: false;
|
|
12
|
+
error: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type ProviderProbeResult = ProviderProbeOk | ProviderProbeFail;
|
|
16
|
+
|
|
17
|
+
/** Best-effort rollback of partial uploads. */
|
|
18
|
+
export interface UploadTracker<THandle> {
|
|
19
|
+
readonly handles: THandle[];
|
|
20
|
+
push(handle: THandle): void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface CreateUploadAdapterOptions {
|
|
24
|
+
/** Collect rollback handles during upload (partial-failure cleanup). */
|
|
25
|
+
tracker?: UploadTracker<unknown>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Full storage backend module: upload, restore, probe, rollback. */
|
|
29
|
+
export interface StorageProviderModule extends ChunkResolveProvider {
|
|
30
|
+
createUploadAdapter(options?: CreateUploadAdapterOptions): StorageAdapter;
|
|
31
|
+
probe?(): Promise<ProviderProbeResult>;
|
|
32
|
+
rollbackUpload?(handles: unknown[]): Promise<void>;
|
|
33
|
+
/** Validate parcel before restore (provider mix, missing chunks). */
|
|
34
|
+
assertParcelRestorable?(parcel: Parcel): void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function createUploadTracker<THandle>(): UploadTracker<THandle> {
|
|
38
|
+
const handles: THandle[] = [];
|
|
39
|
+
return {
|
|
40
|
+
handles,
|
|
41
|
+
push(handle: THandle) {
|
|
42
|
+
handles.push(handle);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
package/src/preload.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node `--import` entry — `target-supabase-sdk/preload`
|
|
3
|
+
* @see .cursor/skills/service-preload/SKILL.md
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { runServicePreload } from "./node/preload/run-service-preload";
|
|
7
|
+
export type { ServicePreloadOptions } from "./node/preload/service-preload.interface";
|
|
@@ -31,15 +31,14 @@ export function isTaskRepoContext(value: unknown): value is TaskRepoContext {
|
|
|
31
31
|
export function normalizeRepoContextModule(
|
|
32
32
|
moduleExports: unknown,
|
|
33
33
|
taskTypeKey: string,
|
|
34
|
-
exportName?: string
|
|
34
|
+
exportName?: string,
|
|
35
35
|
): TaskRepoContext | null {
|
|
36
36
|
if (moduleExports == null) {
|
|
37
37
|
return null;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
const record = moduleExports as Record<string, unknown>;
|
|
41
|
-
const namedExport =
|
|
42
|
-
exportName != null && exportName !== "" ? record[exportName] : undefined;
|
|
41
|
+
const namedExport = exportName != null && exportName !== "" ? record[exportName] : undefined;
|
|
43
42
|
const defaultExport = record.default;
|
|
44
43
|
const candidate = namedExport ?? defaultExport ?? moduleExports;
|
|
45
44
|
|
|
@@ -103,7 +102,7 @@ export function getScriptLoadKey(script: TaskRepoScriptRecord): string {
|
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
export function assertScriptLoadable(
|
|
106
|
-
details: TaskRepoScriptDetails
|
|
105
|
+
details: TaskRepoScriptDetails,
|
|
107
106
|
): details is TaskRepoScriptDetails & ({ source: string } | { modulePath: string }) {
|
|
108
107
|
const hasSource = details.source != null && details.source.trim() !== "";
|
|
109
108
|
const hasModulePath = details.modulePath != null && details.modulePath.trim() !== "";
|
package/src/repo/repo-manager.ts
CHANGED
|
@@ -1,21 +1,11 @@
|
|
|
1
|
-
import { getPossibleTarget } from "../core.api";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { getPossibleTarget } from "../core.api";
|
|
2
|
+
import type { LoggerWithScope } from "../shared/log";
|
|
3
|
+
import { supabase } from "../supabase";
|
|
4
4
|
import type { TaskRepoContext, TaskRepoScriptRecord } from "../task/task-repo-context";
|
|
5
5
|
import { TASK_REPO_SCRIPT_CATEGORY } from "../task/task-repo-context";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
pickEntryScript,
|
|
10
|
-
} from "./repo-context.utils";
|
|
11
|
-
import { CategoryRepo, Repo } from "./repo.interface";
|
|
12
|
-
import {
|
|
13
|
-
clearRepoScriptModuleCache,
|
|
14
|
-
loadRepoContextFromScript,
|
|
15
|
-
loadRepoContextFromUrl,
|
|
16
|
-
} from "./repo.script-loader";
|
|
17
|
-
|
|
18
|
-
const supabase = SupabaseInitializer.getInstance();
|
|
6
|
+
import { CategoryRepo, type Repo } from "./repo.interface";
|
|
7
|
+
import { clearRepoScriptModuleCache, loadRepoContextFromScript, loadRepoContextFromUrl } from "./repo.script-loader";
|
|
8
|
+
import { assertScriptLoadable, isTaskRepoContext, pickEntryScript } from "./repo-context.utils";
|
|
19
9
|
|
|
20
10
|
type LocalRepoEntry =
|
|
21
11
|
| { kind: "context"; context: TaskRepoContext }
|
|
@@ -24,16 +14,31 @@ type LocalRepoEntry =
|
|
|
24
14
|
const localRepoRegistry = new Map<string, LocalRepoEntry>();
|
|
25
15
|
const remoteContextCache = new Map<string, TaskRepoContext>();
|
|
26
16
|
|
|
17
|
+
export type RepoContextFailureReason =
|
|
18
|
+
| "LOCAL_REPO_LOAD_FAILED"
|
|
19
|
+
| "LOCAL_REPO_NOT_FOUND"
|
|
20
|
+
| "REMOTE_REPO_NOT_FOUND"
|
|
21
|
+
| "REMOTE_REPO_LOAD_FAILED";
|
|
22
|
+
|
|
23
|
+
export type RepoContextResolvedVia = "local" | "remote";
|
|
24
|
+
|
|
27
25
|
export interface GetRepoContextParams {
|
|
28
|
-
logger:
|
|
26
|
+
logger: LoggerWithScope;
|
|
29
27
|
/** Task type key (`task.value`) — matches {@link Repo.value} for remote lookup; local registry key */
|
|
30
28
|
taskTypeKey: string;
|
|
29
|
+
/**
|
|
30
|
+
* When false, skip Supabase fetch if the task type is not in the local registry.
|
|
31
|
+
* Default `true`.
|
|
32
|
+
*/
|
|
33
|
+
includeRemote?: boolean;
|
|
31
34
|
}
|
|
32
35
|
|
|
33
36
|
export interface GetRepoContextResult<T extends TaskRepoContext = TaskRepoContext> {
|
|
34
37
|
context: T | null;
|
|
35
38
|
/** Present when `context` is null — import / DB / format failure at repo layer */
|
|
36
39
|
error?: string;
|
|
40
|
+
failureReason?: RepoContextFailureReason;
|
|
41
|
+
resolvedVia?: RepoContextResolvedVia;
|
|
37
42
|
}
|
|
38
43
|
|
|
39
44
|
function buildRemoteCacheKey(taskTypeKey: string, contentHash: string): string {
|
|
@@ -65,9 +70,9 @@ async function fetchRemoteScripts(taskTypeKey: string): Promise<TaskRepoScriptRe
|
|
|
65
70
|
}
|
|
66
71
|
|
|
67
72
|
async function loadLocalEntry(
|
|
68
|
-
logger:
|
|
73
|
+
logger: LoggerWithScope,
|
|
69
74
|
entry: LocalRepoEntry,
|
|
70
|
-
taskTypeKey: string
|
|
75
|
+
taskTypeKey: string,
|
|
71
76
|
): Promise<TaskRepoContext | null> {
|
|
72
77
|
if (entry.kind === "context") {
|
|
73
78
|
return entry.context;
|
|
@@ -90,17 +95,14 @@ async function loadLocalEntry(
|
|
|
90
95
|
return loaded?.context ?? null;
|
|
91
96
|
}
|
|
92
97
|
|
|
93
|
-
async function loadRemoteRepoContext(
|
|
94
|
-
logger:
|
|
95
|
-
taskTypeKey: string
|
|
96
|
-
): Promise<GetRepoContextResult> {
|
|
97
|
-
logger.info("從 Supabase 加載 Repo", { topic: "repo", context: { taskTypeKey } });
|
|
98
|
+
async function loadRemoteRepoContext(logger: LoggerWithScope, taskTypeKey: string): Promise<GetRepoContextResult> {
|
|
99
|
+
logger.info("從 Supabase 加載 Repo", { topic: "repo", data: { taskTypeKey } });
|
|
98
100
|
|
|
99
101
|
const remoteRepo = await fetchRemoteRepo(taskTypeKey);
|
|
100
102
|
if (remoteRepo == null) {
|
|
101
103
|
const error = `Supabase 未找到 Repo (value=${taskTypeKey})`;
|
|
102
|
-
logger.warn(error, { topic: "repo",
|
|
103
|
-
return { context: null, error };
|
|
104
|
+
logger.warn(error, { topic: "repo", data: { taskTypeKey } });
|
|
105
|
+
return { context: null, error, failureReason: "REMOTE_REPO_NOT_FOUND" };
|
|
104
106
|
}
|
|
105
107
|
|
|
106
108
|
const repoUrl = remoteRepo.details?.url?.trim() ?? "";
|
|
@@ -108,8 +110,8 @@ async function loadRemoteRepoContext(
|
|
|
108
110
|
const cacheKey = buildRemoteCacheKey(taskTypeKey, repoHash);
|
|
109
111
|
const cached = remoteContextCache.get(cacheKey);
|
|
110
112
|
if (cached != null) {
|
|
111
|
-
logger.info("命中遠程 Repo 上下文緩存", { topic: "repo",
|
|
112
|
-
return { context: cached };
|
|
113
|
+
logger.info("命中遠程 Repo 上下文緩存", { topic: "repo", data: { cacheKey } });
|
|
114
|
+
return { context: cached, resolvedVia: "remote" };
|
|
113
115
|
}
|
|
114
116
|
|
|
115
117
|
const scripts = await fetchRemoteScripts(taskTypeKey);
|
|
@@ -123,7 +125,7 @@ async function loadRemoteRepoContext(
|
|
|
123
125
|
if (loaded == null && repoUrl !== "") {
|
|
124
126
|
logger.info("未找到 script 行,嘗試從 Repo.details.url 加載", {
|
|
125
127
|
topic: "repo",
|
|
126
|
-
|
|
128
|
+
data: { taskTypeKey, url: repoUrl },
|
|
127
129
|
});
|
|
128
130
|
loaded = await loadRepoContextFromUrl({ logger, url: repoUrl, taskTypeKey });
|
|
129
131
|
}
|
|
@@ -132,47 +134,55 @@ async function loadRemoteRepoContext(
|
|
|
132
134
|
const error = `無法從 Repo 加載 TaskRepoContext (hasUrl=${repoUrl !== ""}, scriptCount=${scripts.length})`;
|
|
133
135
|
logger.warn(error, {
|
|
134
136
|
topic: "repo",
|
|
135
|
-
|
|
137
|
+
data: { taskTypeKey, hasUrl: repoUrl !== "", scriptCount: scripts.length },
|
|
136
138
|
});
|
|
137
|
-
return { context: null, error };
|
|
139
|
+
return { context: null, error, failureReason: "REMOTE_REPO_LOAD_FAILED" };
|
|
138
140
|
}
|
|
139
141
|
|
|
140
142
|
remoteContextCache.set(cacheKey, loaded.context);
|
|
141
|
-
return { context: loaded.context };
|
|
143
|
+
return { context: loaded.context, resolvedVia: "remote" };
|
|
142
144
|
}
|
|
143
145
|
|
|
144
146
|
const getRepoContext = async <RepoContext extends TaskRepoContext>({
|
|
145
147
|
logger,
|
|
146
148
|
taskTypeKey,
|
|
149
|
+
includeRemote = true,
|
|
147
150
|
}: GetRepoContextParams): Promise<GetRepoContextResult<RepoContext>> => {
|
|
148
151
|
const localEntry = localRepoRegistry.get(taskTypeKey);
|
|
149
152
|
if (localEntry != null) {
|
|
150
|
-
logger.info("使用本地註冊的 Repo", { topic: "repo",
|
|
153
|
+
logger.info("使用本地註冊的 Repo", { topic: "repo", data: { taskTypeKey } });
|
|
151
154
|
const context = await loadLocalEntry(logger, localEntry, taskTypeKey);
|
|
152
155
|
if (context != null && isTaskRepoContext(context)) {
|
|
153
|
-
return { context: context as RepoContext };
|
|
156
|
+
return { context: context as RepoContext, resolvedVia: "local" };
|
|
154
157
|
}
|
|
155
158
|
const error = "本地 Repo 模組加載失敗或未導出有效的 TaskRepoContext";
|
|
156
|
-
logger.warn(error, { topic: "repo",
|
|
157
|
-
return { context: null, error };
|
|
159
|
+
logger.warn(error, { topic: "repo", data: { taskTypeKey } });
|
|
160
|
+
return { context: null, error, failureReason: "LOCAL_REPO_LOAD_FAILED" };
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (!includeRemote) {
|
|
164
|
+
const error = `本地未註冊 Repo (value=${taskTypeKey})`;
|
|
165
|
+
logger.warn(error, { topic: "repo", data: { taskTypeKey, includeRemote: false } });
|
|
166
|
+
return { context: null, error, failureReason: "LOCAL_REPO_NOT_FOUND" };
|
|
158
167
|
}
|
|
159
168
|
|
|
160
169
|
try {
|
|
161
170
|
const result = await loadRemoteRepoContext(logger, taskTypeKey);
|
|
162
171
|
if (result.context != null && isTaskRepoContext(result.context)) {
|
|
163
|
-
return { context: result.context as RepoContext };
|
|
172
|
+
return { context: result.context as RepoContext, resolvedVia: "remote" };
|
|
164
173
|
}
|
|
165
174
|
return {
|
|
166
175
|
context: null,
|
|
167
176
|
error: result.error ?? "遠程 Repo 上下文無效",
|
|
177
|
+
failureReason: result.failureReason ?? "REMOTE_REPO_LOAD_FAILED",
|
|
168
178
|
};
|
|
169
179
|
} catch (error) {
|
|
170
180
|
const message = error instanceof Error ? error.message : String(error);
|
|
171
181
|
logger.error("從 Supabase 加載 Repo 失敗", {
|
|
172
182
|
topic: "repo",
|
|
173
|
-
|
|
183
|
+
data: { taskTypeKey, error: message },
|
|
174
184
|
});
|
|
175
|
-
return { context: null, error: message };
|
|
185
|
+
return { context: null, error: message, failureReason: "REMOTE_REPO_LOAD_FAILED" };
|
|
176
186
|
}
|
|
177
187
|
};
|
|
178
188
|
|
|
@@ -196,6 +206,10 @@ function unregisterLocalRepo(taskTypeKey: string): void {
|
|
|
196
206
|
localRepoRegistry.delete(taskTypeKey);
|
|
197
207
|
}
|
|
198
208
|
|
|
209
|
+
function hasLocalRepo(taskTypeKey: string): boolean {
|
|
210
|
+
return localRepoRegistry.has(taskTypeKey);
|
|
211
|
+
}
|
|
212
|
+
|
|
199
213
|
function getRegisteredLocalTaskTypeKeys(): string[] {
|
|
200
214
|
return [...localRepoRegistry.keys()];
|
|
201
215
|
}
|
|
@@ -209,6 +223,7 @@ const RepoManager = {
|
|
|
209
223
|
registerLocalRepoContext,
|
|
210
224
|
registerLocalModule,
|
|
211
225
|
unregisterLocalRepo,
|
|
226
|
+
hasLocalRepo,
|
|
212
227
|
getRegisteredLocalTaskTypeKeys,
|
|
213
228
|
clearRemoteContextCache,
|
|
214
229
|
clearRepoScriptModuleCache,
|
package/src/repo/repo.api.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { scanTargetList, validateWithSchema } from "../core.api";
|
|
2
|
-
import { generateResponse, SupabaseResponse } from "../core.interface";
|
|
3
1
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
2
|
+
import { scanTargetList, validateWithSchema } from "../core.api";
|
|
3
|
+
import { generateResponse, type SupabaseResponse } from "../core.interface";
|
|
4
|
+
import { CategoryRepo, type Repo } from "./repo.interface";
|
|
5
5
|
|
|
6
6
|
const REPO_USAGE_FIELD = "details->>usage" as const;
|
|
7
7
|
|
|
@@ -16,7 +16,7 @@ export type GetScanRemoteRepoValuesPayload = z.infer<typeof getScanRemoteRepoVal
|
|
|
16
16
|
* Returns `{ data: string[] }` on success; validation and DB failures use `{ error }` (never throws).
|
|
17
17
|
*/
|
|
18
18
|
export const getScanRemoteRepoValues = async (
|
|
19
|
-
payload: GetScanRemoteRepoValuesPayload
|
|
19
|
+
payload: GetScanRemoteRepoValuesPayload,
|
|
20
20
|
): Promise<SupabaseResponse<string[]>> => {
|
|
21
21
|
try {
|
|
22
22
|
return await getScanRemoteRepoValuesValidated(payload);
|
|
@@ -28,7 +28,7 @@ export const getScanRemoteRepoValues = async (
|
|
|
28
28
|
|
|
29
29
|
const getScanRemoteRepoValuesValidated = validateWithSchema(
|
|
30
30
|
getScanRemoteRepoValuesSchema,
|
|
31
|
-
"getScanRemoteRepoValuesSchema"
|
|
31
|
+
"getScanRemoteRepoValuesSchema",
|
|
32
32
|
)(async ({ usage }): Promise<SupabaseResponse<string[]>> => {
|
|
33
33
|
try {
|
|
34
34
|
const { data } = await scanTargetList<Repo>({
|