primitive-admin 1.1.0-alpha.9 → 1.2.0-alpha.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/README.md +530 -116
- package/assets/skill/skills/primitive-platform/SKILL.md +295 -0
- package/dist/bin/primitive.d.ts +2 -0
- package/dist/bin/primitive.js +372 -21
- package/dist/bin/primitive.js.map +1 -1
- package/dist/src/commands/admins.d.ts +2 -0
- package/dist/src/commands/admins.js +136 -30
- package/dist/src/commands/admins.js.map +1 -1
- package/dist/src/commands/analytics.d.ts +2 -0
- package/dist/src/commands/analytics.js +713 -55
- package/dist/src/commands/analytics.js.map +1 -1
- package/dist/src/commands/apps.d.ts +2 -0
- package/dist/src/commands/apps.js +65 -100
- package/dist/src/commands/apps.js.map +1 -1
- package/dist/src/commands/auth-sessions.d.ts +7 -0
- package/dist/src/commands/auth-sessions.js +144 -0
- package/dist/src/commands/auth-sessions.js.map +1 -0
- package/dist/src/commands/auth.d.ts +2 -0
- package/dist/src/commands/auth.js +238 -108
- package/dist/src/commands/auth.js.map +1 -1
- package/dist/src/commands/blob-buckets.d.ts +2 -0
- package/dist/src/commands/blob-buckets.js +331 -0
- package/dist/src/commands/blob-buckets.js.map +1 -0
- package/dist/src/commands/catalog.d.ts +2 -0
- package/dist/src/commands/catalog.js +63 -48
- package/dist/src/commands/catalog.js.map +1 -1
- package/dist/src/commands/collection-type-configs.d.ts +2 -0
- package/dist/src/commands/collection-type-configs.js +85 -0
- package/dist/src/commands/collection-type-configs.js.map +1 -0
- package/dist/src/commands/collections.d.ts +2 -0
- package/dist/src/commands/collections.js +1285 -0
- package/dist/src/commands/collections.js.map +1 -0
- package/dist/src/commands/comparisons.d.ts +2 -0
- package/dist/src/commands/comparisons.js +6 -6
- package/dist/src/commands/comparisons.js.map +1 -1
- package/dist/src/commands/config.d.ts +46 -0
- package/dist/src/commands/config.js +465 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/connections.d.ts +2 -0
- package/dist/src/commands/connections.js +99 -0
- package/dist/src/commands/connections.js.map +1 -0
- package/dist/src/commands/cron-triggers.d.ts +2 -0
- package/dist/src/commands/cron-triggers.js +266 -0
- package/dist/src/commands/cron-triggers.js.map +1 -0
- package/dist/src/commands/database-type-configs.d.ts +2 -0
- package/dist/src/commands/database-type-configs.js +164 -0
- package/dist/src/commands/database-type-configs.js.map +1 -0
- package/dist/src/commands/database-types.d.ts +2 -0
- package/dist/src/commands/database-types.js +171 -0
- package/dist/src/commands/database-types.js.map +1 -0
- package/dist/src/commands/databases.d.ts +65 -0
- package/dist/src/commands/databases.js +1868 -243
- package/dist/src/commands/databases.js.map +1 -1
- package/dist/src/commands/documents.d.ts +60 -0
- package/dist/src/commands/documents.js +2888 -22
- package/dist/src/commands/documents.js.map +1 -1
- package/dist/src/commands/email-templates.d.ts +2 -0
- package/dist/src/commands/email-templates.js +175 -0
- package/dist/src/commands/email-templates.js.map +1 -0
- package/dist/src/commands/env.d.ts +23 -0
- package/dist/src/commands/env.js +395 -0
- package/dist/src/commands/env.js.map +1 -0
- package/dist/src/commands/feature-flags.d.ts +14 -0
- package/dist/src/commands/feature-flags.js +117 -0
- package/dist/src/commands/feature-flags.js.map +1 -0
- package/dist/src/commands/functions.d.ts +20 -0
- package/dist/src/commands/functions.js +1630 -0
- package/dist/src/commands/functions.js.map +1 -0
- package/dist/src/commands/group-type-configs.d.ts +2 -0
- package/dist/src/commands/group-type-configs.js +87 -0
- package/dist/src/commands/group-type-configs.js.map +1 -0
- package/dist/src/commands/groups.d.ts +2 -0
- package/dist/src/commands/groups.js +81 -113
- package/dist/src/commands/groups.js.map +1 -1
- package/dist/src/commands/guides.d.ts +223 -0
- package/dist/src/commands/guides.js +627 -69
- package/dist/src/commands/guides.js.map +1 -1
- package/dist/src/commands/init.d.ts +37 -0
- package/dist/src/commands/init.js +1693 -208
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/integrations.d.ts +2 -0
- package/dist/src/commands/integrations.js +428 -187
- package/dist/src/commands/integrations.js.map +1 -1
- package/dist/src/commands/llm.d.ts +2 -0
- package/dist/src/commands/llm.js +13 -8
- package/dist/src/commands/llm.js.map +1 -1
- package/dist/src/commands/locks.d.ts +8 -0
- package/dist/src/commands/locks.js +175 -0
- package/dist/src/commands/locks.js.map +1 -0
- package/dist/src/commands/metadata-category-configs.d.ts +12 -0
- package/dist/src/commands/metadata-category-configs.js +113 -0
- package/dist/src/commands/metadata-category-configs.js.map +1 -0
- package/dist/src/commands/metadata.d.ts +2 -0
- package/dist/src/commands/metadata.js +288 -0
- package/dist/src/commands/metadata.js.map +1 -0
- package/dist/src/commands/prompts.d.ts +2 -0
- package/dist/src/commands/prompts.js +322 -634
- package/dist/src/commands/prompts.js.map +1 -1
- package/dist/src/commands/rule-sets.d.ts +3 -0
- package/dist/src/commands/rule-sets.js +139 -148
- package/dist/src/commands/rule-sets.js.map +1 -1
- package/dist/src/commands/scripts.d.ts +30 -0
- package/dist/src/commands/scripts.js +688 -0
- package/dist/src/commands/scripts.js.map +1 -0
- package/dist/src/commands/secrets.d.ts +2 -0
- package/dist/src/commands/secrets.js +109 -0
- package/dist/src/commands/secrets.js.map +1 -0
- package/dist/src/commands/sessions.d.ts +2 -0
- package/dist/src/commands/sessions.js +76 -0
- package/dist/src/commands/sessions.js.map +1 -0
- package/dist/src/commands/settings.d.ts +18 -0
- package/dist/src/commands/settings.js +54 -0
- package/dist/src/commands/settings.js.map +1 -0
- package/dist/src/commands/skill.d.ts +2 -0
- package/dist/src/commands/skill.js +29 -0
- package/dist/src/commands/skill.js.map +1 -0
- package/dist/src/commands/sync-app-settings.d.ts +158 -0
- package/dist/src/commands/sync-app-settings.js +328 -0
- package/dist/src/commands/sync-app-settings.js.map +1 -0
- package/dist/src/commands/sync.d.ts +2667 -0
- package/dist/src/commands/sync.js +17141 -834
- package/dist/src/commands/sync.js.map +1 -1
- package/dist/src/commands/tokens.d.ts +2 -0
- package/dist/src/commands/tokens.js +132 -22
- package/dist/src/commands/tokens.js.map +1 -1
- package/dist/src/commands/users.d.ts +2 -0
- package/dist/src/commands/users.js +542 -24
- package/dist/src/commands/users.js.map +1 -1
- package/dist/src/commands/vars.d.ts +8 -0
- package/dist/src/commands/vars.js +97 -0
- package/dist/src/commands/vars.js.map +1 -0
- package/dist/src/commands/waitlist.d.ts +2 -0
- package/dist/src/commands/waitlist.js +12 -11
- package/dist/src/commands/waitlist.js.map +1 -1
- package/dist/src/commands/webhooks.d.ts +31 -0
- package/dist/src/commands/webhooks.js +633 -0
- package/dist/src/commands/webhooks.js.map +1 -0
- package/dist/src/commands/workflows.d.ts +88 -0
- package/dist/src/commands/workflows.js +1568 -742
- package/dist/src/commands/workflows.js.map +1 -1
- package/dist/src/lib/access-rule-display.d.ts +21 -0
- package/dist/src/lib/access-rule-display.js +34 -0
- package/dist/src/lib/access-rule-display.js.map +1 -0
- package/dist/src/lib/api-client.d.ts +2513 -0
- package/dist/src/lib/api-client.js +2456 -162
- package/dist/src/lib/api-client.js.map +1 -1
- package/dist/src/lib/app-match-guard.d.ts +44 -0
- package/dist/src/lib/app-match-guard.js +72 -0
- package/dist/src/lib/app-match-guard.js.map +1 -0
- package/dist/src/lib/app-settings-descriptor.d.ts +263 -0
- package/dist/src/lib/app-settings-descriptor.js +583 -0
- package/dist/src/lib/app-settings-descriptor.js.map +1 -0
- package/dist/src/lib/auth-flow.d.ts +8 -0
- package/dist/src/lib/batch.d.ts +26 -0
- package/dist/src/lib/batch.js +32 -0
- package/dist/src/lib/batch.js.map +1 -0
- package/dist/src/lib/block-layout.d.ts +160 -0
- package/dist/src/lib/block-layout.js +451 -0
- package/dist/src/lib/block-layout.js.map +1 -0
- package/dist/src/lib/block-selector.d.ts +58 -0
- package/dist/src/lib/block-selector.js +92 -0
- package/dist/src/lib/block-selector.js.map +1 -0
- package/dist/src/lib/canonical-json.d.ts +12 -0
- package/dist/src/lib/canonical-json.js +35 -0
- package/dist/src/lib/canonical-json.js.map +1 -0
- package/dist/src/lib/channel.d.ts +30 -0
- package/dist/src/lib/channel.js +68 -0
- package/dist/src/lib/channel.js.map +1 -0
- package/dist/src/lib/cli-manifest.d.ts +68 -0
- package/dist/src/lib/cli-manifest.js +71 -0
- package/dist/src/lib/cli-manifest.js.map +1 -0
- package/dist/src/lib/codegen-shared/generatedFiles.d.ts +101 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js +191 -0
- package/dist/src/lib/codegen-shared/generatedFiles.js.map +1 -0
- package/dist/src/lib/codegen-shared/prettierStable.d.ts +262 -0
- package/dist/src/lib/codegen-shared/prettierStable.js +610 -0
- package/dist/src/lib/codegen-shared/prettierStable.js.map +1 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.d.ts +38 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js +46 -0
- package/dist/src/lib/codegen-shared/resolveCodegenSourceDir.js.map +1 -0
- package/dist/src/lib/collection-export.d.ts +212 -0
- package/dist/src/lib/collection-export.js +288 -0
- package/dist/src/lib/collection-export.js.map +1 -0
- package/dist/src/lib/config-json-field.d.ts +28 -0
- package/dist/src/lib/config-json-field.js +56 -0
- package/dist/src/lib/config-json-field.js.map +1 -0
- package/dist/src/lib/config-object-descriptor.d.ts +127 -0
- package/dist/src/lib/config-object-descriptor.js +740 -0
- package/dist/src/lib/config-object-descriptor.js.map +1 -0
- package/dist/src/lib/config-payload.d.ts +92 -0
- package/dist/src/lib/config-payload.js +161 -0
- package/dist/src/lib/config-payload.js.map +1 -0
- package/dist/src/lib/config-surface.d.ts +141 -0
- package/dist/src/lib/config-surface.js +368 -0
- package/dist/src/lib/config-surface.js.map +1 -0
- package/dist/src/lib/config-toml.d.ts +10 -0
- package/dist/src/lib/config-toml.js +42 -0
- package/dist/src/lib/config-toml.js.map +1 -0
- package/dist/src/lib/config.d.ts +71 -0
- package/dist/src/lib/config.js +71 -68
- package/dist/src/lib/config.js.map +1 -1
- package/dist/src/lib/confirm-prompt.d.ts +83 -0
- package/dist/src/lib/confirm-prompt.js +110 -0
- package/dist/src/lib/confirm-prompt.js.map +1 -0
- package/dist/src/lib/constants.d.ts +11 -0
- package/dist/src/lib/constants.js +12 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/crash-handlers.d.ts +20 -0
- package/dist/src/lib/crash-handlers.js +49 -0
- package/dist/src/lib/crash-handlers.js.map +1 -0
- package/dist/src/lib/credentials-store.d.ts +104 -0
- package/dist/src/lib/credentials-store.js +336 -0
- package/dist/src/lib/credentials-store.js.map +1 -0
- package/dist/src/lib/csv.d.ts +47 -0
- package/dist/src/lib/csv.js +172 -0
- package/dist/src/lib/csv.js.map +1 -0
- package/dist/src/lib/data-input.d.ts +23 -0
- package/dist/src/lib/data-input.js +50 -0
- package/dist/src/lib/data-input.js.map +1 -0
- package/dist/src/lib/db-codegen/dbFingerprint.d.ts +10 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js +17 -0
- package/dist/src/lib/db-codegen/dbFingerprint.js.map +1 -0
- package/dist/src/lib/db-codegen/dbGenerator.d.ts +67 -0
- package/dist/src/lib/db-codegen/dbGenerator.js +170 -0
- package/dist/src/lib/db-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/db-codegen/dbNaming.d.ts +87 -0
- package/dist/src/lib/db-codegen/dbNaming.js +180 -0
- package/dist/src/lib/db-codegen/dbNaming.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTemplates.d.ts +272 -0
- package/dist/src/lib/db-codegen/dbTemplates.js +480 -0
- package/dist/src/lib/db-codegen/dbTemplates.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTsTypes.d.ts +73 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js +139 -0
- package/dist/src/lib/db-codegen/dbTsTypes.js.map +1 -0
- package/dist/src/lib/db-codegen/dbTypeIR.d.ts +146 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js +525 -0
- package/dist/src/lib/db-codegen/dbTypeIR.js.map +1 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.d.ts +112 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js +211 -0
- package/dist/src/lib/db-codegen/generated-operation-def-descriptor.js.map +1 -0
- package/dist/src/lib/deprecation.d.ts +22 -0
- package/dist/src/lib/deprecation.js +43 -0
- package/dist/src/lib/deprecation.js.map +1 -0
- package/dist/src/lib/document-export-permissions.d.ts +30 -0
- package/dist/src/lib/document-export-permissions.js +54 -0
- package/dist/src/lib/document-export-permissions.js.map +1 -0
- package/dist/src/lib/document-ingest-artifact.d.ts +120 -0
- package/dist/src/lib/document-ingest-artifact.js +505 -0
- package/dist/src/lib/document-ingest-artifact.js.map +1 -0
- package/dist/src/lib/document-ingest-input.d.ts +51 -0
- package/dist/src/lib/document-ingest-input.js +132 -0
- package/dist/src/lib/document-ingest-input.js.map +1 -0
- package/dist/src/lib/document-ingest-rows.d.ts +137 -0
- package/dist/src/lib/document-ingest-rows.js +181 -0
- package/dist/src/lib/document-ingest-rows.js.map +1 -0
- package/dist/src/lib/document-ingest.d.ts +101 -0
- package/dist/src/lib/document-ingest.js +384 -0
- package/dist/src/lib/document-ingest.js.map +1 -0
- package/dist/src/lib/env-resolver-core.d.ts +258 -0
- package/dist/src/lib/env-resolver-core.js +447 -0
- package/dist/src/lib/env-resolver-core.js.map +1 -0
- package/dist/src/lib/env-resolver.d.ts +99 -0
- package/dist/src/lib/env-resolver.js +153 -0
- package/dist/src/lib/env-resolver.js.map +1 -0
- package/dist/src/lib/fetch.d.ts +5 -0
- package/dist/src/lib/function-bundle.d.ts +147 -0
- package/dist/src/lib/function-bundle.js +341 -0
- package/dist/src/lib/function-bundle.js.map +1 -0
- package/dist/src/lib/function-collect.d.ts +123 -0
- package/dist/src/lib/function-collect.js +610 -0
- package/dist/src/lib/function-collect.js.map +1 -0
- package/dist/src/lib/function-db-types.d.ts +202 -0
- package/dist/src/lib/function-db-types.js +870 -0
- package/dist/src/lib/function-db-types.js.map +1 -0
- package/dist/src/lib/function-document-types.d.ts +144 -0
- package/dist/src/lib/function-document-types.js +370 -0
- package/dist/src/lib/function-document-types.js.map +1 -0
- package/dist/src/lib/function-grants-preflight.d.ts +64 -0
- package/dist/src/lib/function-grants-preflight.js +105 -0
- package/dist/src/lib/function-grants-preflight.js.map +1 -0
- package/dist/src/lib/function-log-lines.d.ts +76 -0
- package/dist/src/lib/function-log-lines.js +160 -0
- package/dist/src/lib/function-log-lines.js.map +1 -0
- package/dist/src/lib/function-log-row.d.ts +29 -0
- package/dist/src/lib/function-log-row.js +73 -0
- package/dist/src/lib/function-log-row.js.map +1 -0
- package/dist/src/lib/function-log-tail.d.ts +132 -0
- package/dist/src/lib/function-log-tail.js +262 -0
- package/dist/src/lib/function-log-tail.js.map +1 -0
- package/dist/src/lib/function-run.d.ts +289 -0
- package/dist/src/lib/function-run.js +389 -0
- package/dist/src/lib/function-run.js.map +1 -0
- package/dist/src/lib/function-schema-codegen.d.ts +143 -0
- package/dist/src/lib/function-schema-codegen.js +420 -0
- package/dist/src/lib/function-schema-codegen.js.map +1 -0
- package/dist/src/lib/function-sync.d.ts +459 -0
- package/dist/src/lib/function-sync.js +1258 -0
- package/dist/src/lib/function-sync.js.map +1 -0
- package/dist/src/lib/function-trigger-listing.d.ts +27 -0
- package/dist/src/lib/function-trigger-listing.js +70 -0
- package/dist/src/lib/function-trigger-listing.js.map +1 -0
- package/dist/src/lib/function-triggers.d.ts +66 -0
- package/dist/src/lib/function-triggers.js +285 -0
- package/dist/src/lib/function-triggers.js.map +1 -0
- package/dist/src/lib/function-typecheck.d.ts +86 -0
- package/dist/src/lib/function-typecheck.js +370 -0
- package/dist/src/lib/function-typecheck.js.map +1 -0
- package/dist/src/lib/function-versions.d.ts +122 -0
- package/dist/src/lib/function-versions.js +182 -0
- package/dist/src/lib/function-versions.js.map +1 -0
- package/dist/src/lib/generated-allowlist.d.ts +28 -0
- package/dist/src/lib/generated-allowlist.js +280 -0
- package/dist/src/lib/generated-allowlist.js.map +1 -0
- package/dist/src/lib/generated-config-surfaces.d.ts +2936 -0
- package/dist/src/lib/generated-config-surfaces.js +10593 -0
- package/dist/src/lib/generated-config-surfaces.js.map +1 -0
- package/dist/src/lib/generated-sdk-types.d.ts +12 -0
- package/dist/src/lib/generated-sdk-types.js +13 -0
- package/dist/src/lib/generated-sdk-types.js.map +1 -0
- package/dist/src/lib/generated-template-lint.d.ts +212 -0
- package/dist/src/lib/generated-template-lint.js +624 -0
- package/dist/src/lib/generated-template-lint.js.map +1 -0
- package/dist/src/lib/generated-workflow-model-fields.d.ts +20 -0
- package/dist/src/lib/generated-workflow-model-fields.js +53 -0
- package/dist/src/lib/generated-workflow-model-fields.js.map +1 -0
- package/dist/src/lib/google-client-secret-status.d.ts +35 -0
- package/dist/src/lib/google-client-secret-status.js +56 -0
- package/dist/src/lib/google-client-secret-status.js.map +1 -0
- package/dist/src/lib/init-adopt.d.ts +16 -0
- package/dist/src/lib/init-adopt.js +34 -0
- package/dist/src/lib/init-adopt.js.map +1 -0
- package/dist/src/lib/init-assets.d.ts +39 -0
- package/dist/src/lib/init-assets.js +97 -0
- package/dist/src/lib/init-assets.js.map +1 -0
- package/dist/src/lib/init-client-platforms.d.ts +14 -0
- package/dist/src/lib/init-client-platforms.js +71 -0
- package/dist/src/lib/init-client-platforms.js.map +1 -0
- package/dist/src/lib/init-config.d.ts +98 -0
- package/dist/src/lib/init-config.js +186 -0
- package/dist/src/lib/init-config.js.map +1 -0
- package/dist/src/lib/init-email-redirect-uris.d.ts +37 -0
- package/dist/src/lib/init-email-redirect-uris.js +46 -0
- package/dist/src/lib/init-email-redirect-uris.js.map +1 -0
- package/dist/src/lib/init-ios-links.d.ts +91 -0
- package/dist/src/lib/init-ios-links.js +219 -0
- package/dist/src/lib/init-ios-links.js.map +1 -0
- package/dist/src/lib/init-plan.d.ts +80 -0
- package/dist/src/lib/init-plan.js +95 -0
- package/dist/src/lib/init-plan.js.map +1 -0
- package/dist/src/lib/init-production-env.d.ts +48 -0
- package/dist/src/lib/init-production-env.js +59 -0
- package/dist/src/lib/init-production-env.js.map +1 -0
- package/dist/src/lib/init-schema.d.ts +74 -0
- package/dist/src/lib/init-schema.js +358 -0
- package/dist/src/lib/init-schema.js.map +1 -0
- package/dist/src/lib/init-xcode.d.ts +34 -0
- package/dist/src/lib/init-xcode.js +138 -0
- package/dist/src/lib/init-xcode.js.map +1 -0
- package/dist/src/lib/integration-request-config.d.ts +30 -0
- package/dist/src/lib/integration-request-config.js +145 -0
- package/dist/src/lib/integration-request-config.js.map +1 -0
- package/dist/src/lib/integration-selector.d.ts +42 -0
- package/dist/src/lib/integration-selector.js +46 -0
- package/dist/src/lib/integration-selector.js.map +1 -0
- package/dist/src/lib/ios-app-id.d.ts +34 -0
- package/dist/src/lib/ios-app-id.js +69 -0
- package/dist/src/lib/ios-app-id.js.map +1 -0
- package/dist/src/lib/list-options.d.ts +68 -0
- package/dist/src/lib/list-options.js +89 -0
- package/dist/src/lib/list-options.js.map +1 -0
- package/dist/src/lib/local-state.d.ts +55 -0
- package/dist/src/lib/local-state.js +167 -0
- package/dist/src/lib/local-state.js.map +1 -0
- package/dist/src/lib/local-test-cases.d.ts +63 -0
- package/dist/src/lib/local-test-cases.js +136 -0
- package/dist/src/lib/local-test-cases.js.map +1 -0
- package/dist/src/lib/log-inspection.d.ts +710 -0
- package/dist/src/lib/log-inspection.js +814 -0
- package/dist/src/lib/log-inspection.js.map +1 -0
- package/dist/src/lib/logout-admin-session.d.ts +33 -0
- package/dist/src/lib/logout-admin-session.js +70 -0
- package/dist/src/lib/logout-admin-session.js.map +1 -0
- package/dist/src/lib/migration-nag.d.ts +49 -0
- package/dist/src/lib/migration-nag.js +164 -0
- package/dist/src/lib/migration-nag.js.map +1 -0
- package/dist/src/lib/object-status-filter.d.ts +22 -0
- package/dist/src/lib/object-status-filter.js +45 -0
- package/dist/src/lib/object-status-filter.js.map +1 -0
- package/dist/src/lib/output.d.ts +124 -0
- package/dist/src/lib/output.js +219 -8
- package/dist/src/lib/output.js.map +1 -1
- package/dist/src/lib/package-manager.d.ts +140 -0
- package/dist/src/lib/package-manager.js +305 -0
- package/dist/src/lib/package-manager.js.map +1 -0
- package/dist/src/lib/paginate.d.ts +82 -0
- package/dist/src/lib/paginate.js +99 -0
- package/dist/src/lib/paginate.js.map +1 -0
- package/dist/src/lib/platform-owned.d.ts +63 -0
- package/dist/src/lib/platform-owned.js +85 -0
- package/dist/src/lib/platform-owned.js.map +1 -0
- package/dist/src/lib/project-config.d.ts +122 -0
- package/dist/src/lib/project-config.js +244 -0
- package/dist/src/lib/project-config.js.map +1 -0
- package/dist/src/lib/prompt-cost-format.d.ts +11 -0
- package/dist/src/lib/prompt-cost-format.js +41 -0
- package/dist/src/lib/prompt-cost-format.js.map +1 -0
- package/dist/src/lib/prompt-schema-codegen.d.ts +147 -0
- package/dist/src/lib/prompt-schema-codegen.js +462 -0
- package/dist/src/lib/prompt-schema-codegen.js.map +1 -0
- package/dist/src/lib/query-operators.d.ts +43 -0
- package/dist/src/lib/query-operators.js +80 -0
- package/dist/src/lib/query-operators.js.map +1 -0
- package/dist/src/lib/record-filter.d.ts +18 -0
- package/dist/src/lib/record-filter.js +55 -0
- package/dist/src/lib/record-filter.js.map +1 -0
- package/dist/src/lib/refresh-admin-credentials.d.ts +73 -0
- package/dist/src/lib/refresh-admin-credentials.js +123 -0
- package/dist/src/lib/refresh-admin-credentials.js.map +1 -0
- package/dist/src/lib/resolve-init-dev-port.d.ts +56 -0
- package/dist/src/lib/resolve-init-dev-port.js +55 -0
- package/dist/src/lib/resolve-init-dev-port.js.map +1 -0
- package/dist/src/lib/resolve-init-server.d.ts +64 -0
- package/dist/src/lib/resolve-init-server.js +77 -0
- package/dist/src/lib/resolve-init-server.js.map +1 -0
- package/dist/src/lib/resolve-owner.d.ts +19 -0
- package/dist/src/lib/resolve-owner.js +20 -0
- package/dist/src/lib/resolve-owner.js.map +1 -0
- package/dist/src/lib/resolve-platform.d.ts +74 -0
- package/dist/src/lib/resolve-platform.js +105 -0
- package/dist/src/lib/resolve-platform.js.map +1 -0
- package/dist/src/lib/run-status.d.ts +19 -0
- package/dist/src/lib/run-status.generated.d.ts +39 -0
- package/dist/src/lib/run-status.generated.js +66 -0
- package/dist/src/lib/run-status.generated.js.map +1 -0
- package/dist/src/lib/run-status.js +19 -0
- package/dist/src/lib/run-status.js.map +1 -0
- package/dist/src/lib/server-text-normalization.d.ts +51 -0
- package/dist/src/lib/server-text-normalization.js +90 -0
- package/dist/src/lib/server-text-normalization.js.map +1 -0
- package/dist/src/lib/server-url.d.ts +22 -0
- package/dist/src/lib/server-url.js +33 -0
- package/dist/src/lib/server-url.js.map +1 -0
- package/dist/src/lib/signing-secret-status.d.ts +81 -0
- package/dist/src/lib/signing-secret-status.js +116 -0
- package/dist/src/lib/signing-secret-status.js.map +1 -0
- package/dist/src/lib/skill-installer.d.ts +71 -0
- package/dist/src/lib/skill-installer.js +441 -0
- package/dist/src/lib/skill-installer.js.map +1 -0
- package/dist/src/lib/snapshot-audit-source.d.ts +45 -0
- package/dist/src/lib/snapshot-audit-source.js +58 -0
- package/dist/src/lib/snapshot-audit-source.js.map +1 -0
- package/dist/src/lib/snapshot-audit-store.d.ts +52 -0
- package/dist/src/lib/snapshot-audit-store.js +196 -0
- package/dist/src/lib/snapshot-audit-store.js.map +1 -0
- package/dist/src/lib/snapshot-audit.d.ts +207 -0
- package/dist/src/lib/snapshot-audit.js +431 -0
- package/dist/src/lib/snapshot-audit.js.map +1 -0
- package/dist/src/lib/snapshot-build-rows.d.ts +60 -0
- package/dist/src/lib/snapshot-build-rows.js +87 -0
- package/dist/src/lib/snapshot-build-rows.js.map +1 -0
- package/dist/src/lib/snapshot-build.d.ts +50 -0
- package/dist/src/lib/snapshot-build.js +111 -0
- package/dist/src/lib/snapshot-build.js.map +1 -0
- package/dist/src/lib/snapshot-manifest-layout.d.ts +61 -0
- package/dist/src/lib/snapshot-manifest-layout.js +70 -0
- package/dist/src/lib/snapshot-manifest-layout.js.map +1 -0
- package/dist/src/lib/snapshots.d.ts +98 -0
- package/dist/src/lib/snapshots.js +294 -0
- package/dist/src/lib/snapshots.js.map +1 -0
- package/dist/src/lib/step-run-table.d.ts +43 -0
- package/dist/src/lib/step-run-table.js +129 -0
- package/dist/src/lib/step-run-table.js.map +1 -0
- package/dist/src/lib/storage-pending-retry.d.ts +26 -0
- package/dist/src/lib/storage-pending-retry.js +42 -0
- package/dist/src/lib/storage-pending-retry.js.map +1 -0
- package/dist/src/lib/swift-codegen/agentGenerator.d.ts +42 -0
- package/dist/src/lib/swift-codegen/agentGenerator.js +118 -0
- package/dist/src/lib/swift-codegen/agentGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/banners.d.ts +24 -0
- package/dist/src/lib/swift-codegen/banners.js +25 -0
- package/dist/src/lib/swift-codegen/banners.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbGenerator.d.ts +113 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js +926 -0
- package/dist/src/lib/swift-codegen/dbGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.d.ts +42 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js +100 -0
- package/dist/src/lib/swift-codegen/dbSwiftTypes.js.map +1 -0
- package/dist/src/lib/swift-codegen/functionGenerator.d.ts +139 -0
- package/dist/src/lib/swift-codegen/functionGenerator.js +462 -0
- package/dist/src/lib/swift-codegen/functionGenerator.js.map +1 -0
- package/dist/src/lib/swift-codegen/generator.d.ts +100 -0
- package/dist/src/lib/swift-codegen/generator.js +457 -0
- package/dist/src/lib/swift-codegen/generator.js.map +1 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.d.ts +87 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js +661 -0
- package/dist/src/lib/swift-codegen/schemaToSwift.js.map +1 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.d.ts +94 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.js +155 -0
- package/dist/src/lib/swift-codegen/siblingSymbols.js.map +1 -0
- package/dist/src/lib/swift-codegen/swiftNaming.d.ts +85 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js +198 -0
- package/dist/src/lib/swift-codegen/swiftNaming.js.map +1 -0
- package/dist/src/lib/sync-dir-selector.d.ts +21 -0
- package/dist/src/lib/sync-dir-selector.js +30 -0
- package/dist/src/lib/sync-dir-selector.js.map +1 -0
- package/dist/src/lib/sync-paths.d.ts +128 -0
- package/dist/src/lib/sync-paths.js +195 -0
- package/dist/src/lib/sync-paths.js.map +1 -0
- package/dist/src/lib/sync-resource-types.d.ts +563 -0
- package/dist/src/lib/sync-resource-types.js +1073 -0
- package/dist/src/lib/sync-resource-types.js.map +1 -0
- package/dist/src/lib/sync-selectors.d.ts +138 -0
- package/dist/src/lib/sync-selectors.js +289 -0
- package/dist/src/lib/sync-selectors.js.map +1 -0
- package/dist/src/lib/template.d.ts +170 -0
- package/dist/src/lib/template.js +484 -68
- package/dist/src/lib/template.js.map +1 -1
- package/dist/src/lib/test-case-file-names.d.ts +40 -0
- package/dist/src/lib/test-case-file-names.js +91 -0
- package/dist/src/lib/test-case-file-names.js.map +1 -0
- package/dist/src/lib/test-case-keys.d.ts +29 -0
- package/dist/src/lib/test-case-keys.js +55 -0
- package/dist/src/lib/test-case-keys.js.map +1 -0
- package/dist/src/lib/test-case-variables.d.ts +29 -0
- package/dist/src/lib/test-case-variables.js +71 -0
- package/dist/src/lib/test-case-variables.js.map +1 -0
- package/dist/src/lib/token-inject.d.ts +56 -0
- package/dist/src/lib/token-inject.js +204 -0
- package/dist/src/lib/token-inject.js.map +1 -0
- package/dist/src/lib/toml-database-config.d.ts +123 -0
- package/dist/src/lib/toml-database-config.js +544 -0
- package/dist/src/lib/toml-database-config.js.map +1 -0
- package/dist/src/lib/toml-metadata-config.d.ts +151 -0
- package/dist/src/lib/toml-metadata-config.js +476 -0
- package/dist/src/lib/toml-metadata-config.js.map +1 -0
- package/dist/src/lib/toml-native-form.d.ts +46 -0
- package/dist/src/lib/toml-native-form.js +78 -0
- package/dist/src/lib/toml-native-form.js.map +1 -0
- package/dist/src/lib/toml-params-validator.d.ts +129 -0
- package/dist/src/lib/toml-params-validator.js +298 -0
- package/dist/src/lib/toml-params-validator.js.map +1 -0
- package/dist/src/lib/toml-scalar-edit.d.ts +43 -0
- package/dist/src/lib/toml-scalar-edit.js +283 -0
- package/dist/src/lib/toml-scalar-edit.js.map +1 -0
- package/dist/src/lib/user-selector.d.ts +24 -0
- package/dist/src/lib/user-selector.js +33 -0
- package/dist/src/lib/user-selector.js.map +1 -0
- package/dist/src/lib/version-check.d.ts +35 -0
- package/dist/src/lib/version-check.js +241 -0
- package/dist/src/lib/version-check.js.map +1 -0
- package/dist/src/lib/watch.d.ts +121 -0
- package/dist/src/lib/watch.js +169 -0
- package/dist/src/lib/watch.js.map +1 -0
- package/dist/src/lib/web-url.d.ts +40 -0
- package/dist/src/lib/web-url.js +76 -0
- package/dist/src/lib/web-url.js.map +1 -0
- package/dist/src/lib/webhook-deliver.d.ts +209 -0
- package/dist/src/lib/webhook-deliver.js +519 -0
- package/dist/src/lib/webhook-deliver.js.map +1 -0
- package/dist/src/lib/workflow-apply.d.ts +110 -0
- package/dist/src/lib/workflow-apply.js +164 -0
- package/dist/src/lib/workflow-apply.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.d.ts +129 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js +269 -0
- package/dist/src/lib/workflow-codegen/generated-schema-descriptor.js.map +1 -0
- package/dist/src/lib/workflow-codegen/generator.d.ts +96 -0
- package/dist/src/lib/workflow-codegen/generator.js +361 -0
- package/dist/src/lib/workflow-codegen/generator.js.map +1 -0
- package/dist/src/lib/workflow-codegen/invokerIR.d.ts +94 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js +76 -0
- package/dist/src/lib/workflow-codegen/invokerIR.js.map +1 -0
- package/dist/src/lib/workflow-codegen/naming.d.ts +33 -0
- package/dist/src/lib/workflow-codegen/naming.js +81 -0
- package/dist/src/lib/workflow-codegen/naming.js.map +1 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.d.ts +80 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js +303 -0
- package/dist/src/lib/workflow-codegen/schemaToTs.js.map +1 -0
- package/dist/src/lib/workflow-config-apply.d.ts +70 -0
- package/dist/src/lib/workflow-config-apply.js +137 -0
- package/dist/src/lib/workflow-config-apply.js.map +1 -0
- package/dist/src/lib/workflow-config-sidecar.d.ts +63 -0
- package/dist/src/lib/workflow-config-sidecar.js +96 -0
- package/dist/src/lib/workflow-config-sidecar.js.map +1 -0
- package/dist/src/lib/workflow-defaults.d.ts +29 -0
- package/dist/src/lib/workflow-defaults.js +41 -0
- package/dist/src/lib/workflow-defaults.js.map +1 -0
- package/dist/src/lib/workflow-field-descriptor.d.ts +91 -0
- package/dist/src/lib/workflow-field-descriptor.js +153 -0
- package/dist/src/lib/workflow-field-descriptor.js.map +1 -0
- package/dist/src/lib/workflow-fragments.d.ts +64 -0
- package/dist/src/lib/workflow-fragments.js +342 -0
- package/dist/src/lib/workflow-fragments.js.map +1 -0
- package/dist/src/lib/workflow-include-preserve.d.ts +76 -0
- package/dist/src/lib/workflow-include-preserve.js +286 -0
- package/dist/src/lib/workflow-include-preserve.js.map +1 -0
- package/dist/src/lib/workflow-payload.d.ts +98 -0
- package/dist/src/lib/workflow-payload.js +178 -0
- package/dist/src/lib/workflow-payload.js.map +1 -0
- package/dist/src/lib/workflow-toml-validator.d.ts +211 -0
- package/dist/src/lib/workflow-toml-validator.js +770 -0
- package/dist/src/lib/workflow-toml-validator.js.map +1 -0
- package/dist/src/lib/workflow-usage.d.ts +196 -0
- package/dist/src/lib/workflow-usage.js +310 -0
- package/dist/src/lib/workflow-usage.js.map +1 -0
- package/dist/src/types/index.d.ts +591 -0
- package/dist/src/validators.d.ts +65 -0
- package/dist/src/validators.js +64 -0
- package/dist/src/validators.js.map +1 -0
- package/package.json +34 -9
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import { parseConfigToml } from "./config-toml.js";
|
|
3
|
+
import { error } from "./output.js";
|
|
4
|
+
/**
|
|
5
|
+
* Parse the shared `--filter` / `--filter-file` option pair used by the record
|
|
6
|
+
* read/query verbs on both surfaces: `databases records` (`query`, `count`,
|
|
7
|
+
* `aggregate`, `delete-all`) and `documents records` (`query`, `count`,
|
|
8
|
+
* `aggregate`).
|
|
9
|
+
*
|
|
10
|
+
* `--filter` takes an inline JSON object; `--filter-file` reads the filter from
|
|
11
|
+
* a JSON file, or a TOML file (either a top-level table or a `[filter]` section).
|
|
12
|
+
* The two options are mutually exclusive. All validation happens CLI-side so a
|
|
13
|
+
* malformed filter produces a clear error rather than a server 500.
|
|
14
|
+
*
|
|
15
|
+
* Exits the process with a clear message on bad input. Returns `undefined` when
|
|
16
|
+
* neither option is supplied.
|
|
17
|
+
*/
|
|
18
|
+
export function parseFilterOptions(options) {
|
|
19
|
+
if (options.filter && options.filterFile) {
|
|
20
|
+
error("Cannot use both --filter and --filter-file.");
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
if (options.filterFile) {
|
|
24
|
+
let content;
|
|
25
|
+
try {
|
|
26
|
+
content = readFileSync(options.filterFile, "utf-8");
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
error(`Failed to read filter file: ${err.message}`);
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
if (options.filterFile.endsWith(".toml")) {
|
|
34
|
+
const parsed = parseConfigToml(content);
|
|
35
|
+
return parsed.filter || parsed;
|
|
36
|
+
}
|
|
37
|
+
return JSON.parse(content);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
error(`Invalid filter file: ${err.message}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (options.filter) {
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(options.filter);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
error("Invalid --filter JSON.");
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=record-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-filter.js","sourceRoot":"","sources":["../../../src/lib/record-filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAGlC;IACC,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACzC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAQ,CAAC;gBAC/C,OAAO,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for refreshing the admin access token via the CLI auth API.
|
|
3
|
+
*
|
|
4
|
+
* Why this module exists:
|
|
5
|
+
*
|
|
6
|
+
* - `ApiClient.refreshToken()` already POSTs to /admin/api/auth/refresh
|
|
7
|
+
* before every API call when the access token is near expiry.
|
|
8
|
+
* - `primitive token` (issue #772) now needs the same exchange so it can
|
|
9
|
+
* auto-refresh a stale token before printing it.
|
|
10
|
+
* - `primitive login --token-stdin` does the same POST a third time to
|
|
11
|
+
* bootstrap credentials from a refresh token piped from another CLI.
|
|
12
|
+
*
|
|
13
|
+
* Putting the HTTP exchange + response parsing in one place keeps the
|
|
14
|
+
* response-shape contract in a single spot (server returns both `jwt` and
|
|
15
|
+
* `accessToken` — see `src/index.ts:2349-2356`) and means future server
|
|
16
|
+
* changes to that endpoint require touching exactly one CLI file.
|
|
17
|
+
*
|
|
18
|
+
* Design notes:
|
|
19
|
+
*
|
|
20
|
+
* - This module **does not** depend on `api-client.ts`. `ApiClient` imports
|
|
21
|
+
* it, not the other way around — that prevents the avoidable module cycle
|
|
22
|
+
* codex flagged in the design review.
|
|
23
|
+
* - It defines its own `RefreshError` so callers can map failures to
|
|
24
|
+
* whatever error type (or exit code) makes sense for their surface.
|
|
25
|
+
* `ApiClient` translates these to `ApiError`; the `token` command
|
|
26
|
+
* translates them to an `error()` + `process.exit(1)`.
|
|
27
|
+
* - It **does not save** the refreshed credentials. The caller decides
|
|
28
|
+
* whether to persist (the `token` command does; `ApiClient.refreshToken`
|
|
29
|
+
* does). Keeping persistence caller-owned matches the existing
|
|
30
|
+
* "storage is owned by `credentials-store.ts`" convention.
|
|
31
|
+
* - It **does not print anything**. Output (success/failure messaging) is
|
|
32
|
+
* the caller's responsibility — important because the `token` command
|
|
33
|
+
* must keep stdout clean for piping.
|
|
34
|
+
*/
|
|
35
|
+
import type { Credentials } from "../types/index.js";
|
|
36
|
+
/**
|
|
37
|
+
* Reasons a refresh attempt can fail. `unauthorized` covers any HTTP non-2xx
|
|
38
|
+
* response (typically a 401 from an expired/invalid refresh token).
|
|
39
|
+
* `network` covers transport-level failures (DNS, ECONNREFUSED, etc.).
|
|
40
|
+
* `missing-refresh-token` is a precondition failure — there's no token to
|
|
41
|
+
* send.
|
|
42
|
+
*/
|
|
43
|
+
export type RefreshFailureKind = "missing-refresh-token" | "unauthorized" | "network";
|
|
44
|
+
export declare class RefreshError extends Error {
|
|
45
|
+
kind: RefreshFailureKind;
|
|
46
|
+
statusCode?: number;
|
|
47
|
+
cause?: unknown;
|
|
48
|
+
/** The server's machine-readable `code`, when it sent one. */
|
|
49
|
+
code?: string;
|
|
50
|
+
constructor(message: string, kind: RefreshFailureKind, statusCode?: number, cause?: unknown,
|
|
51
|
+
/** The server's machine-readable `code`, when it sent one. */
|
|
52
|
+
code?: string);
|
|
53
|
+
}
|
|
54
|
+
/** The refresh token's session was revoked (logout or `auth sessions revoke`). */
|
|
55
|
+
export declare const SESSION_REVOKED_MESSAGE = "This session was revoked. Run 'primitive login'.";
|
|
56
|
+
/** Any other refused refresh. */
|
|
57
|
+
export declare const REFRESH_EXPIRED_MESSAGE = "Refresh token expired. Run 'primitive login'.";
|
|
58
|
+
/**
|
|
59
|
+
* Exchange the stored refresh token for a fresh `accessToken`. Returns a new
|
|
60
|
+
* `Credentials` object — the caller is responsible for persistence via
|
|
61
|
+
* `saveCredentials()` (or whatever storage the caller owns).
|
|
62
|
+
*
|
|
63
|
+
* Server contract: `POST {serverUrl}/admin/api/auth/refresh` with
|
|
64
|
+
* { refreshToken: string }
|
|
65
|
+
* Response (200):
|
|
66
|
+
* { jwt, accessToken, refreshToken, expiresAt }
|
|
67
|
+
*
|
|
68
|
+
* We accept `accessToken` as the canonical field and fall back to `jwt` for
|
|
69
|
+
* forward-compat (the server currently emits both — see issue #772 codex
|
|
70
|
+
* cleanup #3). Login's legacy `data.token` form is dropped — no server
|
|
71
|
+
* version that's still in support emits that field.
|
|
72
|
+
*/
|
|
73
|
+
export declare function refreshAdminCredentials(credentials: Credentials): Promise<Credentials>;
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for refreshing the admin access token via the CLI auth API.
|
|
3
|
+
*
|
|
4
|
+
* Why this module exists:
|
|
5
|
+
*
|
|
6
|
+
* - `ApiClient.refreshToken()` already POSTs to /admin/api/auth/refresh
|
|
7
|
+
* before every API call when the access token is near expiry.
|
|
8
|
+
* - `primitive token` (issue #772) now needs the same exchange so it can
|
|
9
|
+
* auto-refresh a stale token before printing it.
|
|
10
|
+
* - `primitive login --token-stdin` does the same POST a third time to
|
|
11
|
+
* bootstrap credentials from a refresh token piped from another CLI.
|
|
12
|
+
*
|
|
13
|
+
* Putting the HTTP exchange + response parsing in one place keeps the
|
|
14
|
+
* response-shape contract in a single spot (server returns both `jwt` and
|
|
15
|
+
* `accessToken` — see `src/index.ts:2349-2356`) and means future server
|
|
16
|
+
* changes to that endpoint require touching exactly one CLI file.
|
|
17
|
+
*
|
|
18
|
+
* Design notes:
|
|
19
|
+
*
|
|
20
|
+
* - This module **does not** depend on `api-client.ts`. `ApiClient` imports
|
|
21
|
+
* it, not the other way around — that prevents the avoidable module cycle
|
|
22
|
+
* codex flagged in the design review.
|
|
23
|
+
* - It defines its own `RefreshError` so callers can map failures to
|
|
24
|
+
* whatever error type (or exit code) makes sense for their surface.
|
|
25
|
+
* `ApiClient` translates these to `ApiError`; the `token` command
|
|
26
|
+
* translates them to an `error()` + `process.exit(1)`.
|
|
27
|
+
* - It **does not save** the refreshed credentials. The caller decides
|
|
28
|
+
* whether to persist (the `token` command does; `ApiClient.refreshToken`
|
|
29
|
+
* does). Keeping persistence caller-owned matches the existing
|
|
30
|
+
* "storage is owned by `credentials-store.ts`" convention.
|
|
31
|
+
* - It **does not print anything**. Output (success/failure messaging) is
|
|
32
|
+
* the caller's responsibility — important because the `token` command
|
|
33
|
+
* must keep stdout clean for piping.
|
|
34
|
+
*/
|
|
35
|
+
import { fetchWithTLS } from "./fetch.js";
|
|
36
|
+
export class RefreshError extends Error {
|
|
37
|
+
kind;
|
|
38
|
+
statusCode;
|
|
39
|
+
cause;
|
|
40
|
+
code;
|
|
41
|
+
constructor(message, kind, statusCode, cause,
|
|
42
|
+
/** The server's machine-readable `code`, when it sent one. */
|
|
43
|
+
code) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.kind = kind;
|
|
46
|
+
this.statusCode = statusCode;
|
|
47
|
+
this.cause = cause;
|
|
48
|
+
this.code = code;
|
|
49
|
+
this.name = "RefreshError";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/** The refresh token's session was revoked (logout or `auth sessions revoke`). */
|
|
53
|
+
export const SESSION_REVOKED_MESSAGE = "This session was revoked. Run 'primitive login'.";
|
|
54
|
+
/** Any other refused refresh. */
|
|
55
|
+
export const REFRESH_EXPIRED_MESSAGE = "Refresh token expired. Run 'primitive login'.";
|
|
56
|
+
/**
|
|
57
|
+
* Exchange the stored refresh token for a fresh `accessToken`. Returns a new
|
|
58
|
+
* `Credentials` object — the caller is responsible for persistence via
|
|
59
|
+
* `saveCredentials()` (or whatever storage the caller owns).
|
|
60
|
+
*
|
|
61
|
+
* Server contract: `POST {serverUrl}/admin/api/auth/refresh` with
|
|
62
|
+
* { refreshToken: string }
|
|
63
|
+
* Response (200):
|
|
64
|
+
* { jwt, accessToken, refreshToken, expiresAt }
|
|
65
|
+
*
|
|
66
|
+
* We accept `accessToken` as the canonical field and fall back to `jwt` for
|
|
67
|
+
* forward-compat (the server currently emits both — see issue #772 codex
|
|
68
|
+
* cleanup #3). Login's legacy `data.token` form is dropped — no server
|
|
69
|
+
* version that's still in support emits that field.
|
|
70
|
+
*/
|
|
71
|
+
export async function refreshAdminCredentials(credentials) {
|
|
72
|
+
if (!credentials.refreshToken) {
|
|
73
|
+
throw new RefreshError("No refresh token available. Please login again.", "missing-refresh-token");
|
|
74
|
+
}
|
|
75
|
+
const url = `${credentials.serverUrl}/admin/api/auth/refresh`;
|
|
76
|
+
const headers = {
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
};
|
|
79
|
+
if (credentials.globalAdminAppId) {
|
|
80
|
+
headers["X-Global-Admin-App-Id"] = credentials.globalAdminAppId;
|
|
81
|
+
}
|
|
82
|
+
let response;
|
|
83
|
+
try {
|
|
84
|
+
response = await fetchWithTLS(url, {
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers,
|
|
87
|
+
body: JSON.stringify({ refreshToken: credentials.refreshToken }),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (cause) {
|
|
91
|
+
const reason = cause instanceof Error && cause.message
|
|
92
|
+
? cause.message
|
|
93
|
+
: String(cause);
|
|
94
|
+
throw new RefreshError(`Network error refreshing token: ${reason}.`, "network", undefined, cause);
|
|
95
|
+
}
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
// #3885: a refresh of a revoked session answers 401 with code
|
|
98
|
+
// SESSION_REVOKED; say so, rather than calling the token expired.
|
|
99
|
+
let code;
|
|
100
|
+
try {
|
|
101
|
+
const body = (await response.json());
|
|
102
|
+
code = typeof body?.code === "string" ? body.code : undefined;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Not JSON: no code to report.
|
|
106
|
+
}
|
|
107
|
+
throw new RefreshError(code === "SESSION_REVOKED"
|
|
108
|
+
? SESSION_REVOKED_MESSAGE
|
|
109
|
+
: REFRESH_EXPIRED_MESSAGE, "unauthorized", response.status, undefined, code);
|
|
110
|
+
}
|
|
111
|
+
const data = (await response.json());
|
|
112
|
+
const accessToken = data?.accessToken || data?.jwt;
|
|
113
|
+
if (!accessToken) {
|
|
114
|
+
throw new RefreshError("Refresh response did not include an access token. Run 'primitive login'.", "unauthorized", response.status);
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
...credentials,
|
|
118
|
+
accessToken,
|
|
119
|
+
refreshToken: data.refreshToken || credentials.refreshToken,
|
|
120
|
+
expiresAt: data.expiresAt || new Date(Date.now() + 3600 * 1000).toISOString(),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=refresh-admin-credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh-admin-credentials.js","sourceRoot":"","sources":["../../../src/lib/refresh-admin-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAe1C,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG5B;IACA;IACA;IAEA;IANT,YACE,OAAe,EACR,IAAwB,EACxB,UAAmB,EACnB,KAAe;IACtB,8DAA8D;IACvD,IAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,SAAI,GAAJ,IAAI,CAAoB;QACxB,eAAU,GAAV,UAAU,CAAS;QACnB,UAAK,GAAL,KAAK,CAAU;QAEf,SAAI,GAAJ,IAAI,CAAS;QAGpB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,kFAAkF;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAClC,kDAAkD,CAAC;AAErD,iCAAiC;AACjC,MAAM,CAAC,MAAM,uBAAuB,GAClC,+CAA+C,CAAC;AAElD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAwB;IAExB,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;QAC9B,MAAM,IAAI,YAAY,CACpB,iDAAiD,EACjD,uBAAuB,CACxB,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,WAAW,CAAC,SAAS,yBAAyB,CAAC;IAC9D,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;KACnC,CAAC;IACF,IAAI,WAAW,CAAC,gBAAgB,EAAE,CAAC;QACjC,OAAO,CAAC,uBAAuB,CAAC,GAAG,WAAW,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,IAAI,QAAkD,CAAC;IACvD,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,WAAW,CAAC,YAAY,EAAE,CAAC;SACjE,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GACV,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO;YACrC,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,IAAI,YAAY,CACpB,mCAAmC,MAAM,GAAG,EAC5C,SAAS,EACT,SAAS,EACT,KAAK,CACN,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,8DAA8D;QAC9D,kEAAkE;QAClE,IAAI,IAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;YAC5C,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;QACD,MAAM,IAAI,YAAY,CACpB,IAAI,KAAK,iBAAiB;YACxB,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,uBAAuB,EAC3B,cAAc,EACd,QAAQ,CAAC,MAAM,EACf,SAAS,EACT,IAAI,CACL,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAC;IAC5C,MAAM,WAAW,GAAuB,IAAI,EAAE,WAAW,IAAI,IAAI,EAAE,GAAG,CAAC;IACvE,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,YAAY,CACpB,0EAA0E,EAC1E,cAAc,EACd,QAAQ,CAAC,MAAM,CAChB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,GAAG,WAAW;QACd,WAAW;QACX,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,YAAY;QAC3D,SAAS,EACP,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;KACrE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resolution of the dev server port for `primitive init` (step 6).
|
|
3
|
+
*
|
|
4
|
+
* Background (issue #2720): `primitive init --help` documents a `dev_port`
|
|
5
|
+
* init-config key and `init-config.ts` validates it, but the step-6 prompt ran
|
|
6
|
+
* unconditionally — the only branch in the command that wasn't guarded with
|
|
7
|
+
* `if (initConfig)`. So the config's port was ignored, and on a piped/CI stdin
|
|
8
|
+
* the `@inquirer/prompts` `input` threw `ERR_USE_AFTER_CLOSE` into a swallowing
|
|
9
|
+
* catch: the run kept 5173, skipped the CORS/redirect-URI update a non-default
|
|
10
|
+
* port needs, and still exited 0.
|
|
11
|
+
*
|
|
12
|
+
* Resolution follows the same interactivity contract as `resolve-platform.ts`:
|
|
13
|
+
*
|
|
14
|
+
* (a) init-config with `dev_port` -> use it (never prompt)
|
|
15
|
+
* (b) init-config without `dev_port` -> keep the default (never prompt)
|
|
16
|
+
* (c) interactive TTY, no config -> prompt
|
|
17
|
+
* (d) non-TTY, no config -> keep the default WITHOUT prompting,
|
|
18
|
+
* so the closed-stdin crash above can't happen
|
|
19
|
+
*
|
|
20
|
+
* Extracting the decision into a pure function (with injectable `isTTY` /
|
|
21
|
+
* `promptFn`) makes the terminal-dependent contract unit-testable.
|
|
22
|
+
*/
|
|
23
|
+
/** Vite's default dev port, and the universal localhost origin for an app. */
|
|
24
|
+
export declare const DEFAULT_DEV_PORT = 5173;
|
|
25
|
+
/** Where the resolved port came from. */
|
|
26
|
+
export type DevPortSource = "config" | "prompt" | "default";
|
|
27
|
+
/** Prompt thunk returning the chosen port. Injectable for testing. */
|
|
28
|
+
export type DevPortPromptFn = () => Promise<number>;
|
|
29
|
+
export interface ResolveDevPortOptions {
|
|
30
|
+
/** `dev_port` from a loaded `.primitive-init.toml`, if set. */
|
|
31
|
+
configPort?: number;
|
|
32
|
+
/**
|
|
33
|
+
* Whether a non-interactive init-config file is in effect. When `true`, the
|
|
34
|
+
* prompt is skipped entirely (cases a/b) regardless of TTY.
|
|
35
|
+
*/
|
|
36
|
+
hasConfig: boolean;
|
|
37
|
+
/** Whether stdin is an interactive TTY. Inject `false` to exercise case (d). */
|
|
38
|
+
isTTY: boolean;
|
|
39
|
+
/** Prompt function used only in the interactive case (c). */
|
|
40
|
+
promptFn: DevPortPromptFn;
|
|
41
|
+
/** Overridable default, for tests. */
|
|
42
|
+
defaultPort?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface ResolvedDevPort {
|
|
45
|
+
port: number;
|
|
46
|
+
source: DevPortSource;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validates a typed-in port. Shared by the interactive prompt so a rejected
|
|
50
|
+
* value reads the same as the init-config validation in `init-config.ts`.
|
|
51
|
+
*/
|
|
52
|
+
export declare function validateDevPort(value: string): true | string;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the dev server port per the 4-case contract above.
|
|
55
|
+
*/
|
|
56
|
+
export declare function resolveDevPort(options: ResolveDevPortOptions): Promise<ResolvedDevPort>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resolution of the dev server port for `primitive init` (step 6).
|
|
3
|
+
*
|
|
4
|
+
* Background (issue #2720): `primitive init --help` documents a `dev_port`
|
|
5
|
+
* init-config key and `init-config.ts` validates it, but the step-6 prompt ran
|
|
6
|
+
* unconditionally — the only branch in the command that wasn't guarded with
|
|
7
|
+
* `if (initConfig)`. So the config's port was ignored, and on a piped/CI stdin
|
|
8
|
+
* the `@inquirer/prompts` `input` threw `ERR_USE_AFTER_CLOSE` into a swallowing
|
|
9
|
+
* catch: the run kept 5173, skipped the CORS/redirect-URI update a non-default
|
|
10
|
+
* port needs, and still exited 0.
|
|
11
|
+
*
|
|
12
|
+
* Resolution follows the same interactivity contract as `resolve-platform.ts`:
|
|
13
|
+
*
|
|
14
|
+
* (a) init-config with `dev_port` -> use it (never prompt)
|
|
15
|
+
* (b) init-config without `dev_port` -> keep the default (never prompt)
|
|
16
|
+
* (c) interactive TTY, no config -> prompt
|
|
17
|
+
* (d) non-TTY, no config -> keep the default WITHOUT prompting,
|
|
18
|
+
* so the closed-stdin crash above can't happen
|
|
19
|
+
*
|
|
20
|
+
* Extracting the decision into a pure function (with injectable `isTTY` /
|
|
21
|
+
* `promptFn`) makes the terminal-dependent contract unit-testable.
|
|
22
|
+
*/
|
|
23
|
+
/** Vite's default dev port, and the universal localhost origin for an app. */
|
|
24
|
+
export const DEFAULT_DEV_PORT = 5173;
|
|
25
|
+
/**
|
|
26
|
+
* Validates a typed-in port. Shared by the interactive prompt so a rejected
|
|
27
|
+
* value reads the same as the init-config validation in `init-config.ts`.
|
|
28
|
+
*/
|
|
29
|
+
export function validateDevPort(value) {
|
|
30
|
+
const port = parseInt(value, 10);
|
|
31
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
32
|
+
return "Enter a valid port number.";
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Resolve the dev server port per the 4-case contract above.
|
|
38
|
+
*/
|
|
39
|
+
export async function resolveDevPort(options) {
|
|
40
|
+
const defaultPort = options.defaultPort ?? DEFAULT_DEV_PORT;
|
|
41
|
+
// (a)/(b) non-interactive config present: use its port, else the default.
|
|
42
|
+
if (options.hasConfig) {
|
|
43
|
+
if (options.configPort !== undefined) {
|
|
44
|
+
return { port: options.configPort, source: "config" };
|
|
45
|
+
}
|
|
46
|
+
return { port: defaultPort, source: "default" };
|
|
47
|
+
}
|
|
48
|
+
// (c) interactive TTY, no config: prompt.
|
|
49
|
+
if (options.isTTY) {
|
|
50
|
+
return { port: await options.promptFn(), source: "prompt" };
|
|
51
|
+
}
|
|
52
|
+
// (d) non-TTY, no config: never prompt; keep the default.
|
|
53
|
+
return { port: defaultPort, source: "default" };
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=resolve-init-dev-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-init-dev-port.js","sourceRoot":"","sources":["../../../src/lib/resolve-init-dev-port.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AA6BrC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAC5C,OAAO,4BAA4B,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA8B;IAE9B,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,gBAAgB,CAAC;IAE5D,0EAA0E;IAC1E,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACxD,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClD,CAAC;IAED,0CAA0C;IAC1C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC9D,CAAC;IAED,0DAA0D;IAC1D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resolution of the target server for `primitive init`.
|
|
3
|
+
*
|
|
4
|
+
* Background (issue #2376): the init-config TOML documents a `server` key, but
|
|
5
|
+
* `init` only ever read the `-s/--server` flag and the current credentials. A
|
|
6
|
+
* config that named a different server was silently ignored — the app was
|
|
7
|
+
* created on the CLI's current server and the scaffolded `primitive.json` got
|
|
8
|
+
* that URL too.
|
|
9
|
+
*
|
|
10
|
+
* Precedence (highest first):
|
|
11
|
+
* (a) `-s/--server` flag
|
|
12
|
+
* (b) init-config `server` key
|
|
13
|
+
* (c) the server the CLI is currently logged into
|
|
14
|
+
* (d) `DEFAULT_SERVER_URL`
|
|
15
|
+
*
|
|
16
|
+
* Case (c) has one interactive twist: when the current server is not the
|
|
17
|
+
* default and the run is interactive (no flag, no config, TTY stdin), init
|
|
18
|
+
* asks which server to use. The prompt is TTY- and config-guarded here so a
|
|
19
|
+
* piped/CI stdin can never trigger the `@inquirer/prompts` closed-stdin crash
|
|
20
|
+
* (same hazard hardened in #972/#999).
|
|
21
|
+
*
|
|
22
|
+
* Extracting the decision into a pure function with an injectable prompt
|
|
23
|
+
* mirrors `resolve-platform.ts`, which the same command already uses, and makes
|
|
24
|
+
* the precedence contract unit-testable without a network or a terminal.
|
|
25
|
+
*/
|
|
26
|
+
/** Where the resolved server URL came from. */
|
|
27
|
+
export type InitServerSource = "flag" | "config" | "prompt" | "current" | "default";
|
|
28
|
+
/** Prompt thunk returning the chosen server URL. Injectable for testing. */
|
|
29
|
+
export type ServerPromptFn = () => Promise<string>;
|
|
30
|
+
export interface ResolveInitServerOptions {
|
|
31
|
+
/** Value of the explicit `-s/--server` flag, or `undefined` when omitted. */
|
|
32
|
+
flagServer?: string;
|
|
33
|
+
/** `server` key from a loaded init-config TOML, if a config is present. */
|
|
34
|
+
configServer?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Whether a non-interactive init-config file is in effect. When `true` the
|
|
37
|
+
* prompt is skipped entirely, regardless of TTY.
|
|
38
|
+
*/
|
|
39
|
+
hasConfig: boolean;
|
|
40
|
+
/** Server URL of the current credentials, or `undefined` when logged out. */
|
|
41
|
+
currentServer?: string;
|
|
42
|
+
/** Fallback when nothing else selects a server (`DEFAULT_SERVER_URL`). */
|
|
43
|
+
defaultServer: string;
|
|
44
|
+
/** Whether stdin is an interactive TTY. */
|
|
45
|
+
isTTY: boolean;
|
|
46
|
+
/** Prompt used only in the interactive case. */
|
|
47
|
+
promptFn: ServerPromptFn;
|
|
48
|
+
}
|
|
49
|
+
export interface ResolvedInitServer {
|
|
50
|
+
/** The server init should create the app on and write into the scaffold. */
|
|
51
|
+
serverUrl: string;
|
|
52
|
+
/** Which input selected it. */
|
|
53
|
+
source: InitServerSource;
|
|
54
|
+
/**
|
|
55
|
+
* True when the resolved server differs from the server the stored
|
|
56
|
+
* credentials belong to. Callers use it to authenticate against the target
|
|
57
|
+
* server instead of silently reusing the current login.
|
|
58
|
+
*/
|
|
59
|
+
serverChanged: boolean;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Resolve the server `primitive init` should target, per the precedence above.
|
|
63
|
+
*/
|
|
64
|
+
export declare function resolveInitServer(options: ResolveInitServerOptions): Promise<ResolvedInitServer>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resolution of the target server for `primitive init`.
|
|
3
|
+
*
|
|
4
|
+
* Background (issue #2376): the init-config TOML documents a `server` key, but
|
|
5
|
+
* `init` only ever read the `-s/--server` flag and the current credentials. A
|
|
6
|
+
* config that named a different server was silently ignored — the app was
|
|
7
|
+
* created on the CLI's current server and the scaffolded `primitive.json` got
|
|
8
|
+
* that URL too.
|
|
9
|
+
*
|
|
10
|
+
* Precedence (highest first):
|
|
11
|
+
* (a) `-s/--server` flag
|
|
12
|
+
* (b) init-config `server` key
|
|
13
|
+
* (c) the server the CLI is currently logged into
|
|
14
|
+
* (d) `DEFAULT_SERVER_URL`
|
|
15
|
+
*
|
|
16
|
+
* Case (c) has one interactive twist: when the current server is not the
|
|
17
|
+
* default and the run is interactive (no flag, no config, TTY stdin), init
|
|
18
|
+
* asks which server to use. The prompt is TTY- and config-guarded here so a
|
|
19
|
+
* piped/CI stdin can never trigger the `@inquirer/prompts` closed-stdin crash
|
|
20
|
+
* (same hazard hardened in #972/#999).
|
|
21
|
+
*
|
|
22
|
+
* Extracting the decision into a pure function with an injectable prompt
|
|
23
|
+
* mirrors `resolve-platform.ts`, which the same command already uses, and makes
|
|
24
|
+
* the precedence contract unit-testable without a network or a terminal.
|
|
25
|
+
*/
|
|
26
|
+
import { normalizeServerUrl } from "./channel.js";
|
|
27
|
+
/**
|
|
28
|
+
* Canonical form used for both comparison and the value written into the
|
|
29
|
+
* scaffold: `channel.ts`'s `normalizeServerUrl` (shared with the
|
|
30
|
+
* branch-as-channel detection) strips trailing slashes so `https://host/` and
|
|
31
|
+
* `https://host` compare equal and `${serverUrl}${path}` never doubles up.
|
|
32
|
+
* Unparseable values are left as-is — `validateServerUrl` (now the shared
|
|
33
|
+
* validator in `server-url.ts`) rejects them before they reach here.
|
|
34
|
+
*/
|
|
35
|
+
function canonicalize(url) {
|
|
36
|
+
const trimmed = url.trim();
|
|
37
|
+
return normalizeServerUrl(trimmed) ?? trimmed;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve the server `primitive init` should target, per the precedence above.
|
|
41
|
+
*/
|
|
42
|
+
export async function resolveInitServer(options) {
|
|
43
|
+
const currentServer = options.currentServer
|
|
44
|
+
? canonicalize(options.currentServer)
|
|
45
|
+
: undefined;
|
|
46
|
+
const defaultServer = canonicalize(options.defaultServer);
|
|
47
|
+
const changedFrom = (serverUrl) => !!currentServer && currentServer !== serverUrl;
|
|
48
|
+
// (a)/(b) An explicitly requested server wins; the flag beats the config.
|
|
49
|
+
const explicit = options.flagServer ?? options.configServer;
|
|
50
|
+
if (explicit !== undefined) {
|
|
51
|
+
const serverUrl = canonicalize(explicit);
|
|
52
|
+
return {
|
|
53
|
+
serverUrl,
|
|
54
|
+
source: options.flagServer !== undefined ? "flag" : "config",
|
|
55
|
+
serverChanged: changedFrom(serverUrl),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// (c) Interactive runs on a non-default server ask where to create the app.
|
|
59
|
+
if (currentServer &&
|
|
60
|
+
currentServer !== defaultServer &&
|
|
61
|
+
!options.hasConfig &&
|
|
62
|
+
options.isTTY) {
|
|
63
|
+
const serverUrl = canonicalize(await options.promptFn());
|
|
64
|
+
return {
|
|
65
|
+
serverUrl,
|
|
66
|
+
source: "prompt",
|
|
67
|
+
serverChanged: changedFrom(serverUrl),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// (c)/(d) Stay on the current server, or fall back to the default.
|
|
71
|
+
return {
|
|
72
|
+
serverUrl: currentServer || defaultServer,
|
|
73
|
+
source: currentServer ? "current" : "default",
|
|
74
|
+
serverChanged: false,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=resolve-init-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-init-server.js","sourceRoot":"","sources":["../../../src/lib/resolve-init-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AA8ClD;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,kBAAkB,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAiC;IAEjC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa;QACzC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC;QACrC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,aAAa,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1D,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAW,EAAE,CACjD,CAAC,CAAC,aAAa,IAAI,aAAa,KAAK,SAAS,CAAC;IAEjD,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC;IAC5D,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO;YACL,SAAS;YACT,MAAM,EAAE,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ;YAC5D,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC;SACtC,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,IACE,aAAa;QACb,aAAa,KAAK,aAAa;QAC/B,CAAC,OAAO,CAAC,SAAS;QAClB,OAAO,CAAC,KAAK,EACb,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzD,OAAO;YACL,SAAS;YACT,MAAM,EAAE,QAAQ;YAChB,aAAa,EAAE,WAAW,CAAC,SAAS,CAAC;SACtC,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,OAAO;QACL,SAAS,EAAE,aAAa,IAAI,aAAa;QACzC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAC7C,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One email → userId resolution for every `--owner` flag the CLI carries.
|
|
3
|
+
*
|
|
4
|
+
* It lived inside `commands/documents.ts` from #2763 until #3641 gave
|
|
5
|
+
* `collections create` the same flag. Two copies of a lookup would be two
|
|
6
|
+
* chances to reintroduce the failure #2763 removed — the old admin-only list
|
|
7
|
+
* wrapper flattened every error, including a 403, into "no such user" — so it
|
|
8
|
+
* moved here whole rather than being written a second time.
|
|
9
|
+
*/
|
|
10
|
+
import { ApiClient } from "./api-client.js";
|
|
11
|
+
/**
|
|
12
|
+
* Resolve a `--owner` value to a userId. A value containing "@" is looked up
|
|
13
|
+
* by exact email through the member-accessible `users/lookup` endpoint
|
|
14
|
+
* (issue #2763); anything else is already a user id and is passed through.
|
|
15
|
+
* Failures throw with the server's own message — a permission problem must
|
|
16
|
+
* not read as "no such user", which is how the old admin-only lookup
|
|
17
|
+
* reported it.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveOwnerUserId(client: ApiClient, appId: string, owner: string): Promise<string>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { info } from "./output.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a `--owner` value to a userId. A value containing "@" is looked up
|
|
4
|
+
* by exact email through the member-accessible `users/lookup` endpoint
|
|
5
|
+
* (issue #2763); anything else is already a user id and is passed through.
|
|
6
|
+
* Failures throw with the server's own message — a permission problem must
|
|
7
|
+
* not read as "no such user", which is how the old admin-only lookup
|
|
8
|
+
* reported it.
|
|
9
|
+
*/
|
|
10
|
+
export async function resolveOwnerUserId(client, appId, owner) {
|
|
11
|
+
if (!owner.includes("@"))
|
|
12
|
+
return owner;
|
|
13
|
+
const lookup = await client.lookupUserByEmail(appId, owner);
|
|
14
|
+
if (!lookup?.exists || !lookup.user) {
|
|
15
|
+
throw new Error(`No app user found with email "${owner}" in app ${appId}.`);
|
|
16
|
+
}
|
|
17
|
+
info(`Resolved owner email to userId: ${lookup.user.userId}`);
|
|
18
|
+
return lookup.user.userId;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=resolve-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-owner.js","sourceRoot":"","sources":["../../../src/lib/resolve-owner.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAiB,EACjB,KAAa,EACb,KAAa;IAEb,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,YAAY,KAAK,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,CAAC,mCAAmC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure resolution of the target platforms for `primitive init`.
|
|
3
|
+
*
|
|
4
|
+
* Background (issue #1009): `primitive init` must become platform-aware. The
|
|
5
|
+
* commander `-p, --platform` option no longer carries a `"web"` default, so an
|
|
6
|
+
* omitted flag is `undefined` and distinguishable from an explicit
|
|
7
|
+
* `--platform web`. Resolution follows a 4-case interactivity contract:
|
|
8
|
+
*
|
|
9
|
+
* (a) explicit `--platform` flag set -> use it (never prompt)
|
|
10
|
+
* (b) init-config TOML present (configPlatform may be set) -> use config
|
|
11
|
+
* value, else fall back to "web" (never prompt)
|
|
12
|
+
* (c) interactive TTY, no flag, no config -> prompt with `checkbox`
|
|
13
|
+
* (d) non-TTY, no flag, no config -> fall back to "web" WITHOUT
|
|
14
|
+
* hanging and WITHOUT the `ERR_USE_AFTER_CLOSE` crash that
|
|
15
|
+
* `@inquirer/prompts` throws on a closed/piped stdin (same hazard family
|
|
16
|
+
* hardened in #972/#999 — see `confirm-prompt.ts`).
|
|
17
|
+
*
|
|
18
|
+
* Issue #2890 makes the resolved value a LIST: one Primitive app can have a web
|
|
19
|
+
* client and a native client, and `primitive init my-app --platform web,ios`
|
|
20
|
+
* scaffolds both into one repository. A single platform is just a list of one,
|
|
21
|
+
* so the contract above is unchanged — and the interactive case is a
|
|
22
|
+
* multi-select rather than a single-select.
|
|
23
|
+
*
|
|
24
|
+
* Extracting the decision into a pure function (with injectable `isTTY` /
|
|
25
|
+
* `promptFn`, mirroring `confirm-prompt.ts`) makes the otherwise
|
|
26
|
+
* terminal-dependent interactivity contract unit-testable.
|
|
27
|
+
*/
|
|
28
|
+
export type Platform = "web" | "ios";
|
|
29
|
+
/**
|
|
30
|
+
* Every platform `--platform` accepts, in the order a run processes them: the
|
|
31
|
+
* web client is configured first (it owns the dev-port step). Parsing
|
|
32
|
+
* normalizes to this order, so `--platform ios,web` and `--platform web,ios`
|
|
33
|
+
* scaffold the same repository.
|
|
34
|
+
*/
|
|
35
|
+
export declare const SUPPORTED_PLATFORMS: readonly ["web", "ios"];
|
|
36
|
+
/** Prompt thunk returning the chosen platforms. Injectable for testing. */
|
|
37
|
+
export type PlatformPromptFn = () => Promise<Platform[]>;
|
|
38
|
+
export interface ParsePlatformsResult {
|
|
39
|
+
/** Whether the value named a valid, duplicate-free, non-empty platform set. */
|
|
40
|
+
ok: boolean;
|
|
41
|
+
/** The validated platforms in canonical order; empty when `ok` is false. */
|
|
42
|
+
platforms: Platform[];
|
|
43
|
+
/** A user-facing message naming the supported set; set when `ok` is false. */
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parses a `--platform` flag value (`"web"`, `"web,ios"`) or an init-config
|
|
48
|
+
* `platform` key (a string or a TOML array) into a validated platform list.
|
|
49
|
+
*
|
|
50
|
+
* Returns a result rather than throwing so `validateInitConfig` can collect the
|
|
51
|
+
* message alongside its other errors and the flag path can print it and exit.
|
|
52
|
+
*/
|
|
53
|
+
export declare function parsePlatformList(raw: string | readonly string[]): ParsePlatformsResult;
|
|
54
|
+
export interface ResolvePlatformsOptions {
|
|
55
|
+
/** Parsed `--platform` flag, or `undefined` when omitted. */
|
|
56
|
+
flag?: Platform[];
|
|
57
|
+
/** Parsed `platform` key from a loaded `.primitive-init.toml`, if any. */
|
|
58
|
+
configPlatform?: Platform[];
|
|
59
|
+
/**
|
|
60
|
+
* Whether a non-interactive init-config file is in effect. When `true`, the
|
|
61
|
+
* prompt is skipped entirely (case b) regardless of TTY.
|
|
62
|
+
*/
|
|
63
|
+
hasConfig: boolean;
|
|
64
|
+
/** Whether stdin is an interactive TTY. Inject `false` to exercise case (d). */
|
|
65
|
+
isTTY: boolean;
|
|
66
|
+
/** Prompt function used only in the interactive case (c). */
|
|
67
|
+
promptFn: PlatformPromptFn;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolve the target platforms per the 4-case interactivity contract above.
|
|
71
|
+
*
|
|
72
|
+
* @returns a non-empty list of platforms to scaffold.
|
|
73
|
+
*/
|
|
74
|
+
export declare function resolvePlatforms(options: ResolvePlatformsOptions): Promise<Platform[]>;
|