emdash 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{adapters-BKSf3T9R.d.mts → adapters-DoNJiveC.d.mts} +1 -1
- package/dist/{adapters-BKSf3T9R.d.mts.map → adapters-DoNJiveC.d.mts.map} +1 -1
- package/dist/{apply-x0eMK1lX.mjs → apply-BzltprvY.mjs} +85 -135
- package/dist/apply-BzltprvY.mjs.map +1 -0
- package/dist/astro/index.d.mts +6 -6
- package/dist/astro/index.d.mts.map +1 -1
- package/dist/astro/index.mjs +110 -4
- package/dist/astro/index.mjs.map +1 -1
- package/dist/astro/middleware/auth.d.mts +6 -7
- package/dist/astro/middleware/auth.d.mts.map +1 -1
- package/dist/astro/middleware/auth.mjs +16 -59
- package/dist/astro/middleware/auth.mjs.map +1 -1
- package/dist/astro/middleware/redirect.d.mts.map +1 -1
- package/dist/astro/middleware/redirect.mjs +17 -12
- package/dist/astro/middleware/redirect.mjs.map +1 -1
- package/dist/astro/middleware/request-context.d.mts.map +1 -1
- package/dist/astro/middleware/request-context.mjs +9 -6
- package/dist/astro/middleware/request-context.mjs.map +1 -1
- package/dist/astro/middleware/setup.mjs +1 -1
- package/dist/astro/middleware.d.mts.map +1 -1
- package/dist/astro/middleware.mjs +72 -124
- package/dist/astro/middleware.mjs.map +1 -1
- package/dist/astro/types.d.mts +26 -10
- package/dist/astro/types.d.mts.map +1 -1
- package/dist/{base64-MBPo9ozB.mjs → base64-BRICGH2l.mjs} +1 -1
- package/dist/{base64-MBPo9ozB.mjs.map → base64-BRICGH2l.mjs.map} +1 -1
- package/dist/{byline-Chbr2GoP.mjs → byline-BSaNL1w7.mjs} +4 -4
- package/dist/{byline-Chbr2GoP.mjs.map → byline-BSaNL1w7.mjs.map} +1 -1
- package/dist/bylines-CvJ3PYz2.mjs +113 -0
- package/dist/bylines-CvJ3PYz2.mjs.map +1 -0
- package/dist/cache-C6N_hhN7.mjs +65 -0
- package/dist/cache-C6N_hhN7.mjs.map +1 -0
- package/dist/{chunks-HGz06Soa.mjs → chunks-NBQVDOci.mjs} +8 -2
- package/dist/{chunks-HGz06Soa.mjs.map → chunks-NBQVDOci.mjs.map} +1 -1
- package/dist/cli/index.mjs +224 -30
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/cf-access.d.mts +1 -1
- package/dist/client/index.d.mts +1 -1
- package/dist/client/index.mjs +3 -3
- package/dist/client/index.mjs.map +1 -1
- package/dist/{config-BXwuX8Bx.mjs → config-BI0V3ICQ.mjs} +1 -1
- package/dist/{config-BXwuX8Bx.mjs.map → config-BI0V3ICQ.mjs.map} +1 -1
- package/dist/{content-BcQPYxdV.mjs → content-8lOYF0pr.mjs} +32 -15
- package/dist/{content-BcQPYxdV.mjs.map → content-8lOYF0pr.mjs.map} +1 -1
- package/dist/db/index.d.mts +3 -3
- package/dist/db/index.mjs +2 -2
- package/dist/db/libsql.d.mts +1 -1
- package/dist/db/libsql.d.mts.map +1 -1
- package/dist/db/libsql.mjs +7 -2
- package/dist/db/libsql.mjs.map +1 -1
- package/dist/db/postgres.d.mts +1 -1
- package/dist/db/sqlite.d.mts +1 -1
- package/dist/db/sqlite.d.mts.map +1 -1
- package/dist/db/sqlite.mjs +8 -3
- package/dist/db/sqlite.mjs.map +1 -1
- package/dist/{db-errors-l1Qh2RPR.mjs → db-errors-WRezodiz.mjs} +1 -1
- package/dist/{db-errors-l1Qh2RPR.mjs.map → db-errors-WRezodiz.mjs.map} +1 -1
- package/dist/{default-DCVqE5ib.mjs → default-D8ksjWhO.mjs} +1 -1
- package/dist/{default-DCVqE5ib.mjs.map → default-D8ksjWhO.mjs.map} +1 -1
- package/dist/{dialect-helpers-DhTzaUxP.mjs → dialect-helpers-BKCvISIQ.mjs} +19 -2
- package/dist/dialect-helpers-BKCvISIQ.mjs.map +1 -0
- package/dist/{error-zG5T1UGA.mjs → error-D_-tqP-I.mjs} +1 -1
- package/dist/{error-zG5T1UGA.mjs.map → error-D_-tqP-I.mjs.map} +1 -1
- package/dist/{index-DIb-CzNx.d.mts → index-BFRaVcD6.d.mts} +94 -34
- package/dist/index-BFRaVcD6.d.mts.map +1 -0
- package/dist/index.d.mts +11 -11
- package/dist/index.mjs +29 -27
- package/dist/{load-CyEoextb.mjs → load-DDqMMvZL.mjs} +2 -2
- package/dist/{load-CyEoextb.mjs.map → load-DDqMMvZL.mjs.map} +1 -1
- package/dist/{loader-CndGj8kM.mjs → loader-CKLbBnhK.mjs} +27 -7
- package/dist/loader-CKLbBnhK.mjs.map +1 -0
- package/dist/{manifest-schema-DH9xhc6t.mjs → manifest-schema-DqWNC3lM.mjs} +33 -3
- package/dist/manifest-schema-DqWNC3lM.mjs.map +1 -0
- package/dist/media/index.d.mts +1 -1
- package/dist/media/index.mjs +1 -1
- package/dist/media/local-runtime.d.mts +7 -7
- package/dist/media/local-runtime.mjs +3 -3
- package/dist/{media-D8FbNsl0.mjs → media-BW32b4gi.mjs} +2 -2
- package/dist/{media-D8FbNsl0.mjs.map → media-BW32b4gi.mjs.map} +1 -1
- package/dist/{mode-BnAOqItE.mjs → mode-ier8jbBk.mjs} +1 -1
- package/dist/{mode-BnAOqItE.mjs.map → mode-ier8jbBk.mjs.map} +1 -1
- package/dist/options-BVp3UsTS.mjs +117 -0
- package/dist/options-BVp3UsTS.mjs.map +1 -0
- package/dist/page/index.d.mts +2 -2
- package/dist/{placeholder-D29tWZ7o.d.mts → placeholder-BE4o_2dc.d.mts} +1 -1
- package/dist/{placeholder-D29tWZ7o.d.mts.map → placeholder-BE4o_2dc.d.mts.map} +1 -1
- package/dist/{placeholder-C-fk5hYI.mjs → placeholder-CIJejMlK.mjs} +1 -1
- package/dist/{placeholder-C-fk5hYI.mjs.map → placeholder-CIJejMlK.mjs.map} +1 -1
- package/dist/plugins/adapt-sandbox-entry.d.mts +5 -5
- package/dist/plugins/adapt-sandbox-entry.d.mts.map +1 -1
- package/dist/plugins/adapt-sandbox-entry.mjs +6 -5
- package/dist/plugins/adapt-sandbox-entry.mjs.map +1 -1
- package/dist/public-url-DByxYjUw.mjs +51 -0
- package/dist/public-url-DByxYjUw.mjs.map +1 -0
- package/dist/{query-fqEdLFms.mjs → query-Cg9ZKRQ0.mjs} +114 -16
- package/dist/query-Cg9ZKRQ0.mjs.map +1 -0
- package/dist/{redirect-D_pshWdf.mjs → redirect-BhUBKRc1.mjs} +11 -6
- package/dist/redirect-BhUBKRc1.mjs.map +1 -0
- package/dist/{registry-C3Mr0ODu.mjs → registry-Dw70ChxB.mjs} +38 -4
- package/dist/registry-Dw70ChxB.mjs.map +1 -0
- package/dist/{request-cache-Ci7f5pBb.mjs → request-cache-B-bmkipQ.mjs} +1 -1
- package/dist/{request-cache-Ci7f5pBb.mjs.map → request-cache-B-bmkipQ.mjs.map} +1 -1
- package/dist/runner-Bnoj7vjK.d.mts +44 -0
- package/dist/runner-Bnoj7vjK.d.mts.map +1 -0
- package/dist/{runner-tQ7BJ4T7.mjs → runner-C7ADox5q.mjs} +185 -55
- package/dist/{runner-tQ7BJ4T7.mjs.map → runner-C7ADox5q.mjs.map} +1 -1
- package/dist/runtime.d.mts +6 -6
- package/dist/runtime.mjs +4 -4
- package/dist/{search-BoZYFuUk.mjs → search-dOGEccMa.mjs} +129 -83
- package/dist/search-dOGEccMa.mjs.map +1 -0
- package/dist/secrets-CW3reAnU.mjs +314 -0
- package/dist/secrets-CW3reAnU.mjs.map +1 -0
- package/dist/seed/index.d.mts +2 -2
- package/dist/seed/index.mjs +15 -14
- package/dist/seo/index.d.mts +1 -1
- package/dist/storage/local.d.mts +1 -1
- package/dist/storage/local.mjs +1 -1
- package/dist/storage/s3.d.mts +1 -1
- package/dist/storage/s3.mjs +1 -1
- package/dist/{taxonomies-B4IAshV8.mjs → taxonomies-ZlRtD6AG.mjs} +14 -7
- package/dist/taxonomies-ZlRtD6AG.mjs.map +1 -0
- package/dist/{tokens-D9vnZqYS.mjs → tokens-D7zMmWi2.mjs} +2 -2
- package/dist/{tokens-D9vnZqYS.mjs.map → tokens-D7zMmWi2.mjs.map} +1 -1
- package/dist/{transport-C9ugt2Nr.mjs → transport-BeMCmin1.mjs} +6 -5
- package/dist/{transport-C9ugt2Nr.mjs.map → transport-BeMCmin1.mjs.map} +1 -1
- package/dist/{transport-CUnEL3Vs.d.mts → transport-DNEfeMaU.d.mts} +1 -1
- package/dist/{transport-CUnEL3Vs.d.mts.map → transport-DNEfeMaU.d.mts.map} +1 -1
- package/dist/types-4fVtCIm0.mjs +68 -0
- package/dist/types-4fVtCIm0.mjs.map +1 -0
- package/dist/{types-BmPPSUEx.d.mts → types-BSyXeCFW.d.mts} +24 -2
- package/dist/{types-BmPPSUEx.d.mts.map → types-BSyXeCFW.d.mts.map} +1 -1
- package/dist/{types-i36XcA_X.d.mts → types-BuBIptGk.d.mts} +65 -134
- package/dist/types-BuBIptGk.d.mts.map +1 -0
- package/dist/{types-CgqmmMJB.mjs → types-CDbKp7ND.mjs} +1 -1
- package/dist/{types-CgqmmMJB.mjs.map → types-CDbKp7ND.mjs.map} +1 -1
- package/dist/{types-Bm1dn-q3.mjs → types-CIOg5AR8.mjs} +1 -1
- package/dist/{types-Bm1dn-q3.mjs.map → types-CIOg5AR8.mjs.map} +1 -1
- package/dist/{types-BrA0xf5I.d.mts → types-CJsYGpco.d.mts} +1 -1
- package/dist/{types-BrA0xf5I.d.mts.map → types-CJsYGpco.d.mts.map} +1 -1
- package/dist/{types-BIgulNsW.mjs → types-CRxNbK-Z.mjs} +2 -2
- package/dist/{types-BIgulNsW.mjs.map → types-CRxNbK-Z.mjs.map} +1 -1
- package/dist/{types-CS8FIX7L.d.mts → types-CrtWgIvl.d.mts} +1 -1
- package/dist/{types-CS8FIX7L.d.mts.map → types-CrtWgIvl.d.mts.map} +1 -1
- package/dist/{types-DIMwPFub.d.mts → types-M78DQ1lx.d.mts} +1 -1
- package/dist/{types-DIMwPFub.d.mts.map → types-M78DQ1lx.d.mts.map} +1 -1
- package/dist/{validate-CxVsLehf.mjs → validate-Baqf0slj.mjs} +3 -3
- package/dist/{validate-CxVsLehf.mjs.map → validate-Baqf0slj.mjs.map} +1 -1
- package/dist/{validate-DHxmpFJt.d.mts → validate-BfQh_C_y.d.mts} +4 -4
- package/dist/{validate-DHxmpFJt.d.mts.map → validate-BfQh_C_y.d.mts.map} +1 -1
- package/dist/{validation-C-ZpN2GI.mjs → validation-BfEI7tNe.mjs} +6 -6
- package/dist/{validation-C-ZpN2GI.mjs.map → validation-BfEI7tNe.mjs.map} +1 -1
- package/dist/version-DoxrVdYf.mjs +7 -0
- package/dist/{version-Bbq8TCrz.mjs.map → version-DoxrVdYf.mjs.map} +1 -1
- package/dist/{zod-generator-CpwccCIv.mjs → zod-generator-CC0xNe_K.mjs} +4 -4
- package/dist/zod-generator-CC0xNe_K.mjs.map +1 -0
- package/locals.d.ts +1 -6
- package/package.json +9 -8
- package/src/api/handlers/comments.ts +6 -4
- package/src/api/handlers/content.ts +29 -1
- package/src/api/handlers/device-flow.ts +5 -0
- package/src/api/handlers/marketplace.ts +11 -4
- package/src/api/handlers/oauth-authorization.ts +72 -33
- package/src/api/handlers/revision.ts +23 -14
- package/src/api/handlers/taxonomies.ts +3 -6
- package/src/api/public-url.ts +48 -2
- package/src/api/schemas/comments.ts +2 -2
- package/src/api/schemas/content.ts +17 -0
- package/src/api/schemas/sections.ts +3 -3
- package/src/api/schemas/users.ts +1 -1
- package/src/api/types.ts +5 -1
- package/src/astro/integration/index.ts +17 -0
- package/src/astro/integration/runtime.ts +30 -0
- package/src/astro/integration/virtual-modules.ts +32 -2
- package/src/astro/integration/vite-config.ts +6 -1
- package/src/astro/middleware/auth.ts +13 -6
- package/src/astro/middleware/redirect.ts +29 -16
- package/src/astro/middleware/request-context.ts +15 -5
- package/src/astro/middleware.ts +23 -9
- package/src/astro/routes/api/auth/invite/complete.ts +6 -1
- package/src/astro/routes/api/auth/passkey/register/verify.ts +6 -1
- package/src/astro/routes/api/auth/passkey/verify.ts +6 -1
- package/src/astro/routes/api/auth/signup/complete.ts +6 -1
- package/src/astro/routes/api/comments/[collection]/[contentId]/index.ts +2 -2
- package/src/astro/routes/api/content/[collection]/[id]/discard-draft.ts +4 -2
- package/src/astro/routes/api/content/[collection]/[id]/preview-url.ts +34 -12
- package/src/astro/routes/api/content/[collection]/[id]/publish.ts +32 -2
- package/src/astro/routes/api/content/[collection]/[id]/restore.ts +4 -2
- package/src/astro/routes/api/content/[collection]/[id]/revisions.ts +3 -2
- package/src/astro/routes/api/content/[collection]/[id]/terms/[taxonomy].ts +8 -4
- package/src/astro/routes/api/content/[collection]/[id].ts +12 -0
- package/src/astro/routes/api/import/wordpress/execute.ts +3 -1
- package/src/astro/routes/api/import/wordpress/prepare.ts +7 -8
- package/src/astro/routes/api/import/wordpress-plugin/execute.ts +3 -1
- package/src/astro/routes/api/manifest.ts +62 -45
- package/src/astro/routes/api/media/[id]/confirm.ts +10 -1
- package/src/astro/routes/api/media/providers/[providerId]/index.ts +12 -3
- package/src/astro/routes/api/openapi.json.ts +27 -10
- package/src/astro/routes/api/redirects/404s/index.ts +10 -4
- package/src/astro/routes/api/redirects/404s/summary.ts +4 -2
- package/src/astro/routes/api/redirects/[id].ts +10 -4
- package/src/astro/routes/api/redirects/index.ts +7 -3
- package/src/astro/routes/api/revisions/[revisionId]/index.ts +1 -1
- package/src/astro/routes/api/schema/collections/[slug]/fields/[fieldSlug].ts +0 -2
- package/src/astro/routes/api/schema/collections/[slug]/fields/index.ts +0 -1
- package/src/astro/routes/api/schema/collections/[slug]/fields/reorder.ts +0 -1
- package/src/astro/routes/api/schema/collections/[slug]/index.ts +2 -2
- package/src/astro/routes/api/schema/collections/index.ts +1 -1
- package/src/astro/routes/api/search/index.ts +10 -2
- package/src/astro/routes/api/sections/[slug].ts +10 -4
- package/src/astro/routes/api/sections/index.ts +7 -3
- package/src/astro/routes/api/setup/admin-verify.ts +6 -1
- package/src/astro/routes/api/snapshot.ts +44 -18
- package/src/astro/routes/api/taxonomies/index.ts +0 -1
- package/src/astro/routes/api/themes/preview.ts +11 -5
- package/src/astro/types.ts +23 -3
- package/src/auth/allowed-origins.ts +168 -0
- package/src/auth/passkey-config.ts +35 -13
- package/src/bylines/index.ts +37 -88
- package/src/cli/commands/auth.ts +28 -6
- package/src/cli/commands/bundle-utils.ts +11 -2
- package/src/cli/commands/bundle.ts +28 -8
- package/src/cli/commands/content.ts +13 -0
- package/src/cli/commands/login.ts +8 -1
- package/src/cli/commands/publish.ts +24 -0
- package/src/cli/commands/secrets.ts +183 -0
- package/src/cli/credentials.ts +1 -1
- package/src/cli/index.ts +5 -1
- package/src/client/index.ts +4 -4
- package/src/client/transport.ts +17 -7
- package/src/components/Break.astro +2 -2
- package/src/components/EmDashHead.astro +18 -13
- package/src/components/Embed.astro +1 -1
- package/src/components/Gallery.astro +1 -1
- package/src/components/Image.astro +1 -1
- package/src/components/InlinePortableTextEditor.tsx +104 -18
- package/src/config/secrets.ts +528 -0
- package/src/database/dialect-helpers.ts +50 -0
- package/src/database/migrations/034_published_at_index.ts +1 -1
- package/src/database/migrations/035_bounded_404_log.ts +56 -39
- package/src/database/migrations/runner.ts +156 -23
- package/src/database/repositories/content.ts +36 -12
- package/src/database/repositories/redirect.ts +14 -3
- package/src/database/repositories/taxonomy.ts +26 -0
- package/src/db/libsql.ts +1 -3
- package/src/db/sqlite.ts +2 -5
- package/src/emdash-runtime.ts +84 -159
- package/src/index.ts +9 -0
- package/src/loader.ts +24 -1
- package/src/mcp/server.ts +103 -36
- package/src/page/site-identity.ts +58 -0
- package/src/plugins/adapt-sandbox-entry.ts +22 -10
- package/src/plugins/context.ts +13 -10
- package/src/plugins/define-plugin.ts +40 -12
- package/src/plugins/hooks.ts +23 -19
- package/src/plugins/index.ts +9 -0
- package/src/plugins/manifest-schema.ts +37 -2
- package/src/plugins/types.ts +151 -11
- package/src/preview/urls.ts +23 -3
- package/src/query.ts +148 -5
- package/src/redirects/cache.ts +38 -18
- package/src/schema/registry.ts +56 -0
- package/src/schema/zod-generator.ts +27 -5
- package/src/seed/apply.ts +2 -0
- package/src/settings/index.ts +80 -6
- package/src/settings/types.ts +23 -1
- package/src/taxonomies/index.ts +11 -1
- package/dist/apply-x0eMK1lX.mjs.map +0 -1
- package/dist/bylines-CRNsVG88.mjs +0 -157
- package/dist/bylines-CRNsVG88.mjs.map +0 -1
- package/dist/cache-BkKBuIvS.mjs +0 -56
- package/dist/cache-BkKBuIvS.mjs.map +0 -1
- package/dist/chunk-ClPoSABd.mjs +0 -21
- package/dist/dialect-helpers-DhTzaUxP.mjs.map +0 -1
- package/dist/index-DIb-CzNx.d.mts.map +0 -1
- package/dist/loader-CndGj8kM.mjs.map +0 -1
- package/dist/manifest-schema-DH9xhc6t.mjs.map +0 -1
- package/dist/query-fqEdLFms.mjs.map +0 -1
- package/dist/redirect-D_pshWdf.mjs.map +0 -1
- package/dist/registry-C3Mr0ODu.mjs.map +0 -1
- package/dist/runner-OURCaApa.d.mts +0 -34
- package/dist/runner-OURCaApa.d.mts.map +0 -1
- package/dist/search-BoZYFuUk.mjs.map +0 -1
- package/dist/taxonomies-B4IAshV8.mjs.map +0 -1
- package/dist/types-i36XcA_X.d.mts.map +0 -1
- package/dist/version-Bbq8TCrz.mjs +0 -7
- package/dist/zod-generator-CpwccCIv.mjs.map +0 -1
package/dist/cli/index.mjs
CHANGED
|
@@ -1,22 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
2
|
+
import { i as __exportAll, r as runMigrations, t as getMigrationStatus } from "../runner-C7ADox5q.mjs";
|
|
3
3
|
import { n as createDatabase } from "../connection-2igzM-AT.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import "../
|
|
9
|
-
import { t as
|
|
10
|
-
import {
|
|
11
|
-
import "../redirect-
|
|
12
|
-
import "../byline-
|
|
13
|
-
import { r as isI18nEnabled } from "../config-
|
|
14
|
-
import { n as SchemaRegistry } from "../registry-
|
|
15
|
-
import "../loader-
|
|
16
|
-
import "../request-cache-
|
|
17
|
-
import { i as pluginManifestSchema } from "../manifest-schema-
|
|
18
|
-
import { t as
|
|
4
|
+
import { c as listTablesLike } from "../dialect-helpers-BKCvISIQ.mjs";
|
|
5
|
+
import { t as ContentRepository } from "../content-8lOYF0pr.mjs";
|
|
6
|
+
import { i as encodeBase64url } from "../base64-BRICGH2l.mjs";
|
|
7
|
+
import "../types-CRxNbK-Z.mjs";
|
|
8
|
+
import { t as MediaRepository } from "../media-BW32b4gi.mjs";
|
|
9
|
+
import { p as TaxonomyRepository, t as applySeed } from "../apply-BzltprvY.mjs";
|
|
10
|
+
import { t as OptionsRepository } from "../options-BVp3UsTS.mjs";
|
|
11
|
+
import "../redirect-BhUBKRc1.mjs";
|
|
12
|
+
import "../byline-BSaNL1w7.mjs";
|
|
13
|
+
import { r as isI18nEnabled } from "../config-BI0V3ICQ.mjs";
|
|
14
|
+
import { n as SchemaRegistry } from "../registry-Dw70ChxB.mjs";
|
|
15
|
+
import "../loader-CKLbBnhK.mjs";
|
|
16
|
+
import "../request-cache-B-bmkipQ.mjs";
|
|
17
|
+
import { i as pluginManifestSchema } from "../manifest-schema-DqWNC3lM.mjs";
|
|
18
|
+
import { n as isDeprecatedCapability, t as CAPABILITY_RENAMES } from "../types-4fVtCIm0.mjs";
|
|
19
|
+
import { t as validateSeed } from "../validate-Baqf0slj.mjs";
|
|
20
|
+
import { n as fingerprintKey, r as generateEncryptionKey, t as EmDashSecretsError } from "../secrets-CW3reAnU.mjs";
|
|
19
21
|
import { LocalStorage } from "../storage/local.mjs";
|
|
22
|
+
import { o as convertDataForRead } from "../transport-BeMCmin1.mjs";
|
|
20
23
|
import { createHeaderAwareFetch, customHeadersInterceptor, getCachedAccessToken, isAccessRedirect, resolveCustomHeaders, runCloudflaredLogin } from "../client/cf-access.mjs";
|
|
21
24
|
import { EmDashClient } from "../client/index.mjs";
|
|
22
25
|
import { imageSize } from "image-size";
|
|
@@ -35,10 +38,24 @@ import { packTar } from "modern-tar/fs";
|
|
|
35
38
|
|
|
36
39
|
//#region src/cli/commands/auth.ts
|
|
37
40
|
/**
|
|
38
|
-
* Auth CLI commands
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
*
|
|
41
|
+
* Auth CLI commands (deprecated)
|
|
42
|
+
*
|
|
43
|
+
* Kept as a deprecated alias for backwards compatibility. The original
|
|
44
|
+
* `emdash auth secret` was documented in published docs and is plausibly
|
|
45
|
+
* scripted in user CI (e.g. `npx emdash auth secret >> .env`). Removing
|
|
46
|
+
* it outright would break those scripts on minor-version upgrade.
|
|
47
|
+
*
|
|
48
|
+
* The command still emits an `EMDASH_AUTH_SECRET=<32-byte-base64url>`
|
|
49
|
+
* line, unchanged. `EMDASH_AUTH_SECRET` itself is now legacy: it's only
|
|
50
|
+
* read as a fallback source for the commenter-IP hash salt so installs
|
|
51
|
+
* upgrading from a prior version keep stable IP hashes (and therefore
|
|
52
|
+
* stable rate-limit buckets). New installs don't need to set it.
|
|
53
|
+
*
|
|
54
|
+
* The deprecation note steers users toward `emdash secrets generate`
|
|
55
|
+
* (which emits a different, versioned `emdash_enc_v1_*` value for
|
|
56
|
+
* `EMDASH_ENCRYPTION_KEY` — used to encrypt plugin secrets at rest).
|
|
57
|
+
*
|
|
58
|
+
* Will be removed in a future minor.
|
|
42
59
|
*/
|
|
43
60
|
function generateAuthSecret() {
|
|
44
61
|
const bytes = new Uint8Array(32);
|
|
@@ -48,7 +65,7 @@ function generateAuthSecret() {
|
|
|
48
65
|
const secretCommand = defineCommand({
|
|
49
66
|
meta: {
|
|
50
67
|
name: "secret",
|
|
51
|
-
description: "Generate a
|
|
68
|
+
description: "[DEPRECATED] Generate a value for legacy EMDASH_AUTH_SECRET"
|
|
52
69
|
},
|
|
53
70
|
run() {
|
|
54
71
|
const secret = generateAuthSecret();
|
|
@@ -59,12 +76,13 @@ const secretCommand = defineCommand({
|
|
|
59
76
|
consola$1.log("");
|
|
60
77
|
consola$1.log(pc.dim("Add this to your environment variables."));
|
|
61
78
|
consola$1.log("");
|
|
79
|
+
process.stderr.write(`${pc.yellow("Note:")} ${pc.bold("emdash auth secret")} is deprecated and will be removed in a future minor. ${pc.cyan("EMDASH_AUTH_SECRET")} itself is now optional — it's only used as a legacy fallback for the commenter-IP hash salt. For encrypting plugin secrets at rest, use ${pc.bold("emdash secrets generate")} (a different secret: ${pc.cyan("EMDASH_ENCRYPTION_KEY")}).\n`);
|
|
62
80
|
}
|
|
63
81
|
});
|
|
64
82
|
const authCommand = defineCommand({
|
|
65
83
|
meta: {
|
|
66
84
|
name: "auth",
|
|
67
|
-
description: "Authentication utilities"
|
|
85
|
+
description: "[DEPRECATED] Authentication utilities (use `emdash secrets` for new flows)"
|
|
68
86
|
},
|
|
69
87
|
subCommands: { secret: secretCommand }
|
|
70
88
|
});
|
|
@@ -134,7 +152,10 @@ function readStore() {
|
|
|
134
152
|
return {};
|
|
135
153
|
}
|
|
136
154
|
function writeStore(store) {
|
|
137
|
-
mkdirSync(getConfigDir(), {
|
|
155
|
+
mkdirSync(getConfigDir(), {
|
|
156
|
+
recursive: true,
|
|
157
|
+
mode: 448
|
|
158
|
+
});
|
|
138
159
|
writeFileSync(getCredentialPath(), JSON.stringify(store, null, " "), {
|
|
139
160
|
encoding: "utf-8",
|
|
140
161
|
mode: 384
|
|
@@ -483,7 +504,16 @@ const getCommand$3 = defineCommand({
|
|
|
483
504
|
});
|
|
484
505
|
if (!args.published && item.draftRevisionId) {
|
|
485
506
|
const comparison = await client.compare(args.collection, args.id);
|
|
486
|
-
if (comparison.hasChanges && comparison.draft)
|
|
507
|
+
if (comparison.hasChanges && comparison.draft) {
|
|
508
|
+
item.data = comparison.draft;
|
|
509
|
+
if (!args.raw && item.data) {
|
|
510
|
+
const fields = (await client.collection(args.collection)).fields.map((f) => ({
|
|
511
|
+
slug: f.slug,
|
|
512
|
+
type: f.type
|
|
513
|
+
}));
|
|
514
|
+
item.data = convertDataForRead(item.data, fields, false);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
487
517
|
}
|
|
488
518
|
output(item, args);
|
|
489
519
|
} catch (error) {
|
|
@@ -626,6 +656,7 @@ const deleteCommand$2 = defineCommand({
|
|
|
626
656
|
configureOutputMode(args);
|
|
627
657
|
try {
|
|
628
658
|
await createClientFromArgs(args).delete(args.collection, args.id);
|
|
659
|
+
output({ success: true }, args);
|
|
629
660
|
consola$1.success(`Deleted ${args.collection}/${args.id}`);
|
|
630
661
|
} catch (error) {
|
|
631
662
|
consola$1.error(error instanceof Error ? error.message : "Unknown error");
|
|
@@ -655,6 +686,7 @@ const publishCommand$1 = defineCommand({
|
|
|
655
686
|
configureOutputMode(args);
|
|
656
687
|
try {
|
|
657
688
|
await createClientFromArgs(args).publish(args.collection, args.id);
|
|
689
|
+
output({ success: true }, args);
|
|
658
690
|
consola$1.success(`Published ${args.collection}/${args.id}`);
|
|
659
691
|
} catch (error) {
|
|
660
692
|
consola$1.error(error instanceof Error ? error.message : "Unknown error");
|
|
@@ -684,6 +716,7 @@ const unpublishCommand = defineCommand({
|
|
|
684
716
|
configureOutputMode(args);
|
|
685
717
|
try {
|
|
686
718
|
await createClientFromArgs(args).unpublish(args.collection, args.id);
|
|
719
|
+
output({ success: true }, args);
|
|
687
720
|
consola$1.success(`Unpublished ${args.collection}/${args.id}`);
|
|
688
721
|
} catch (error) {
|
|
689
722
|
consola$1.error(error instanceof Error ? error.message : "Unknown error");
|
|
@@ -718,6 +751,7 @@ const scheduleCommand = defineCommand({
|
|
|
718
751
|
configureOutputMode(args);
|
|
719
752
|
try {
|
|
720
753
|
await createClientFromArgs(args).schedule(args.collection, args.id, { at: args.at });
|
|
754
|
+
output({ success: true }, args);
|
|
721
755
|
consola$1.success(`Scheduled ${args.collection}/${args.id} for ${args.at}`);
|
|
722
756
|
} catch (error) {
|
|
723
757
|
consola$1.error(error instanceof Error ? error.message : "Unknown error");
|
|
@@ -747,6 +781,7 @@ const restoreCommand = defineCommand({
|
|
|
747
781
|
configureOutputMode(args);
|
|
748
782
|
try {
|
|
749
783
|
await createClientFromArgs(args).restore(args.collection, args.id);
|
|
784
|
+
output({ success: true }, args);
|
|
750
785
|
consola$1.success(`Restored ${args.collection}/${args.id}`);
|
|
751
786
|
} catch (error) {
|
|
752
787
|
consola$1.error(error instanceof Error ? error.message : "Unknown error");
|
|
@@ -1841,7 +1876,8 @@ const whoamiCommand = defineCommand({
|
|
|
1841
1876
|
})
|
|
1842
1877
|
});
|
|
1843
1878
|
if (refreshRes.ok) {
|
|
1844
|
-
const
|
|
1879
|
+
const json = await refreshRes.json();
|
|
1880
|
+
const refreshed = json.data && typeof json.data === "object" && "access_token" in json.data ? json.data : json;
|
|
1845
1881
|
token = refreshed.access_token;
|
|
1846
1882
|
saveCredentials(baseUrl, {
|
|
1847
1883
|
...cred,
|
|
@@ -2125,8 +2161,16 @@ const MAX_SCREENSHOTS = 5;
|
|
|
2125
2161
|
const MAX_SCREENSHOT_WIDTH = 1920;
|
|
2126
2162
|
const MAX_SCREENSHOT_HEIGHT = 1080;
|
|
2127
2163
|
const ICON_SIZE = 256;
|
|
2128
|
-
/**
|
|
2129
|
-
|
|
2164
|
+
/**
|
|
2165
|
+
* Matches Node.js built-in imports in bundled output:
|
|
2166
|
+
* - require("node:xxx") / require("xxx")
|
|
2167
|
+
* - import("node:xxx") / import("xxx")
|
|
2168
|
+
* - import X from "node:xxx" / import { X } from "node:xxx"
|
|
2169
|
+
* - import * as X from "node:xxx"
|
|
2170
|
+
* - export { X } from "node:xxx"
|
|
2171
|
+
* Captures the base module name (e.g. "fs" from "node:fs/promises").
|
|
2172
|
+
*/
|
|
2173
|
+
const NODE_BUILTIN_IMPORT_RE = /(?:import|export|require)\s*(?:\(|[^(]*?\bfrom\s+)["'](?:node:)?([a-z_]+)(?:\/[^"']*)?\s*["']\)?/g;
|
|
2130
2174
|
const LEADING_DOT_SLASH_RE = /^\.\//;
|
|
2131
2175
|
const DIST_PREFIX_RE = /^dist\//;
|
|
2132
2176
|
const MJS_EXT_RE = /\.m?js$/;
|
|
@@ -2619,8 +2663,18 @@ const bundleCommand = defineCommand({
|
|
|
2619
2663
|
hasErrors = true;
|
|
2620
2664
|
}
|
|
2621
2665
|
}
|
|
2622
|
-
|
|
2623
|
-
|
|
2666
|
+
const declaresUnrestricted = manifest.capabilities.includes("network:request:unrestricted") || manifest.capabilities.includes("network:fetch:any");
|
|
2667
|
+
const declaresHostRestricted = manifest.capabilities.includes("network:request") || manifest.capabilities.includes("network:fetch");
|
|
2668
|
+
if (declaresUnrestricted) consola.warn("Plugin declares unrestricted network access (network:request:unrestricted) — it can make requests to any host");
|
|
2669
|
+
else if (declaresHostRestricted && manifest.allowedHosts.length === 0) consola.warn("Plugin declares network:request capability but no allowedHosts — all requests will be blocked");
|
|
2670
|
+
const deprecatedCaps = manifest.capabilities.filter(isDeprecatedCapability);
|
|
2671
|
+
if (deprecatedCaps.length > 0) {
|
|
2672
|
+
consola.warn("Plugin uses deprecated capability names. Rename them before publishing:");
|
|
2673
|
+
for (const cap of deprecatedCaps) {
|
|
2674
|
+
const replacement = CAPABILITY_RENAMES[cap];
|
|
2675
|
+
consola.warn(` ${cap} → ${replacement}`);
|
|
2676
|
+
}
|
|
2677
|
+
}
|
|
2624
2678
|
if (resolvedPlugin.admin?.portableTextBlocks && resolvedPlugin.admin.portableTextBlocks.length > 0) consola.warn("Plugin declares portableTextBlocks — these require trusted mode and will be ignored in sandboxed plugins");
|
|
2625
2679
|
if (resolvedPlugin.admin?.entry) consola.warn("Plugin declares admin.entry — custom React components require trusted mode. Use Block Kit for sandboxed admin pages");
|
|
2626
2680
|
if (resolvedPlugin.hooks["page:fragments"]) consola.warn("Plugin declares page:fragments hook — this is trusted-only and will not work in sandboxed mode");
|
|
@@ -3115,6 +3169,16 @@ const publishCommand = defineCommand({
|
|
|
3115
3169
|
if (manifest.capabilities.length > 0) consola.info(`Capabilities: ${manifest.capabilities.join(", ")}`);
|
|
3116
3170
|
if (manifest.allowedHosts?.length) consola.info(`Allowed hosts: ${manifest.allowedHosts.join(", ")}`);
|
|
3117
3171
|
console.log();
|
|
3172
|
+
const deprecatedCaps = manifest.capabilities.filter(isDeprecatedCapability);
|
|
3173
|
+
if (deprecatedCaps.length > 0) {
|
|
3174
|
+
consola.error("Plugin declares deprecated capability names. Rename them and re-bundle before publishing:");
|
|
3175
|
+
for (const cap of deprecatedCaps) {
|
|
3176
|
+
const replacement = CAPABILITY_RENAMES[cap];
|
|
3177
|
+
consola.error(` ${cap} → ${replacement}`);
|
|
3178
|
+
}
|
|
3179
|
+
consola.error("See https://emdashcms.com/docs/plugins/overview#capabilities for the full rename table.");
|
|
3180
|
+
process.exit(1);
|
|
3181
|
+
}
|
|
3118
3182
|
let token;
|
|
3119
3183
|
const envToken = process.env.EMDASH_MARKETPLACE_TOKEN;
|
|
3120
3184
|
const stored = !envToken ? getMarketplaceCredential(registryUrl) : null;
|
|
@@ -3572,6 +3636,134 @@ const searchCommand = defineCommand({
|
|
|
3572
3636
|
}
|
|
3573
3637
|
});
|
|
3574
3638
|
|
|
3639
|
+
//#endregion
|
|
3640
|
+
//#region src/cli/commands/secrets.ts
|
|
3641
|
+
/**
|
|
3642
|
+
* Secrets CLI commands
|
|
3643
|
+
*
|
|
3644
|
+
* Pure (no-DB) commands for working with EmDash secrets:
|
|
3645
|
+
*
|
|
3646
|
+
* - `emdash secrets generate` — emits a fresh `EMDASH_ENCRYPTION_KEY`.
|
|
3647
|
+
* Optionally writes it to `.dev.vars` (Workers) or `.env` (Node).
|
|
3648
|
+
* - `emdash secrets fingerprint <key>` — prints the kid for a key,
|
|
3649
|
+
* useful in CI for verifying what's been deployed without exposing
|
|
3650
|
+
* the raw value.
|
|
3651
|
+
*
|
|
3652
|
+
* DB-touching commands (`status`, `migrate`, `rotate`) live elsewhere:
|
|
3653
|
+
* the CLI process can't open the production D1/Postgres binding from
|
|
3654
|
+
* the operator's machine, so those operations ship as admin HTTP
|
|
3655
|
+
* endpoints in a later PR. A thin `--site <url>` wrapper for those
|
|
3656
|
+
* endpoints can land alongside.
|
|
3657
|
+
*/
|
|
3658
|
+
const KEY_VAR_NAME = "EMDASH_ENCRYPTION_KEY";
|
|
3659
|
+
/** Matches a populated entry — `KEY=<at least one char>`. */
|
|
3660
|
+
const POPULATED_KEY_LINE_PATTERN = /^EMDASH_ENCRYPTION_KEY=.+$/m;
|
|
3661
|
+
/**
|
|
3662
|
+
* Matches any line starting `KEY=` including `KEY=` with empty value.
|
|
3663
|
+
* Used for in-place replacement when the entry exists but has no value.
|
|
3664
|
+
*/
|
|
3665
|
+
const ANY_KEY_LINE_PATTERN = /^EMDASH_ENCRYPTION_KEY=.*$/m;
|
|
3666
|
+
/**
|
|
3667
|
+
* Append (or replace) `EMDASH_ENCRYPTION_KEY` in a dotenv-style file.
|
|
3668
|
+
*
|
|
3669
|
+
* Idempotent: if the entry exists with a populated value, leaves it alone
|
|
3670
|
+
* (returns `"skipped"`) unless `force` is set. An entry with an empty
|
|
3671
|
+
* value (`EMDASH_ENCRYPTION_KEY=`) is treated as "not set" and gets
|
|
3672
|
+
* replaced — placeholder lines aren't a reason to refuse.
|
|
3673
|
+
*
|
|
3674
|
+
* Always ends the resulting file with a trailing newline. Doesn't touch
|
|
3675
|
+
* other variables.
|
|
3676
|
+
*
|
|
3677
|
+
* Exported for tests.
|
|
3678
|
+
*/
|
|
3679
|
+
function writeEncryptionKeyToFile(targetPath, value, force) {
|
|
3680
|
+
const existing = existsSync(targetPath) ? readFileSync(targetPath, "utf-8") : "";
|
|
3681
|
+
if (POPULATED_KEY_LINE_PATTERN.test(existing) && !force) return "skipped";
|
|
3682
|
+
const newLine = `${KEY_VAR_NAME}=${value}`;
|
|
3683
|
+
let next;
|
|
3684
|
+
if (ANY_KEY_LINE_PATTERN.test(existing)) {
|
|
3685
|
+
next = existing.replace(ANY_KEY_LINE_PATTERN, newLine);
|
|
3686
|
+
if (!next.endsWith("\n")) next += "\n";
|
|
3687
|
+
} else next = `${existing}${existing.length === 0 ? "" : existing.endsWith("\n") ? "" : "\n"}${newLine}\n`;
|
|
3688
|
+
writeFileSync(targetPath, next);
|
|
3689
|
+
return "wrote";
|
|
3690
|
+
}
|
|
3691
|
+
const generateCommand = defineCommand({
|
|
3692
|
+
meta: {
|
|
3693
|
+
name: "generate",
|
|
3694
|
+
description: "Generate a new EmDash encryption key"
|
|
3695
|
+
},
|
|
3696
|
+
args: {
|
|
3697
|
+
write: {
|
|
3698
|
+
type: "string",
|
|
3699
|
+
description: "Optional path to write the key to (e.g. .dev.vars or .env). Won't overwrite an existing entry without --force."
|
|
3700
|
+
},
|
|
3701
|
+
force: {
|
|
3702
|
+
type: "boolean",
|
|
3703
|
+
description: "When used with --write, overwrite an existing entry",
|
|
3704
|
+
default: false
|
|
3705
|
+
}
|
|
3706
|
+
},
|
|
3707
|
+
run({ args }) {
|
|
3708
|
+
const value = generateEncryptionKey();
|
|
3709
|
+
if (args.write) {
|
|
3710
|
+
if (writeEncryptionKeyToFile(resolve(process.cwd(), args.write), value, args.force) === "skipped") {
|
|
3711
|
+
consola$1.info(`${KEY_VAR_NAME} already set in ${pc.cyan(args.write)}; leaving it alone. Pass ${pc.bold("--force")} to replace it.`);
|
|
3712
|
+
return;
|
|
3713
|
+
}
|
|
3714
|
+
consola$1.log("");
|
|
3715
|
+
consola$1.log(`${pc.bold("Wrote")} ${pc.cyan(KEY_VAR_NAME)} to ${pc.cyan(args.write)}`);
|
|
3716
|
+
consola$1.log("");
|
|
3717
|
+
consola$1.log(pc.yellow("Keep this file out of version control. Losing the key means losing every secret encrypted with it."));
|
|
3718
|
+
consola$1.log("");
|
|
3719
|
+
return;
|
|
3720
|
+
}
|
|
3721
|
+
process.stdout.write(`${value}\n`);
|
|
3722
|
+
const guidance = [
|
|
3723
|
+
"",
|
|
3724
|
+
pc.bold("EmDash encryption key generated."),
|
|
3725
|
+
"",
|
|
3726
|
+
`Set ${pc.cyan(KEY_VAR_NAME)} in your environment.`,
|
|
3727
|
+
"For Cloudflare deployments, push it to your Worker's secrets.",
|
|
3728
|
+
"For Node deployments, add it to your process environment or .env file.",
|
|
3729
|
+
"",
|
|
3730
|
+
pc.yellow("Keep this value secret. Losing it means losing every secret encrypted with it."),
|
|
3731
|
+
""
|
|
3732
|
+
].join("\n");
|
|
3733
|
+
process.stderr.write(`${guidance}\n`);
|
|
3734
|
+
}
|
|
3735
|
+
});
|
|
3736
|
+
const fingerprintCommand = defineCommand({
|
|
3737
|
+
meta: {
|
|
3738
|
+
name: "fingerprint",
|
|
3739
|
+
description: "Print the kid (8-char fingerprint) for an encryption key"
|
|
3740
|
+
},
|
|
3741
|
+
args: { key: {
|
|
3742
|
+
type: "positional",
|
|
3743
|
+
description: "The full key value (with the emdash_enc_v1_ prefix)",
|
|
3744
|
+
required: true
|
|
3745
|
+
} },
|
|
3746
|
+
async run({ args }) {
|
|
3747
|
+
try {
|
|
3748
|
+
const kid = await fingerprintKey(args.key);
|
|
3749
|
+
process.stdout.write(`${kid}\n`);
|
|
3750
|
+
} catch (error) {
|
|
3751
|
+
consola$1.error(error instanceof EmDashSecretsError ? error.message : "Failed to fingerprint key");
|
|
3752
|
+
process.exit(1);
|
|
3753
|
+
}
|
|
3754
|
+
}
|
|
3755
|
+
});
|
|
3756
|
+
const secretsCommand = defineCommand({
|
|
3757
|
+
meta: {
|
|
3758
|
+
name: "secrets",
|
|
3759
|
+
description: "Manage EmDash secrets (generate, inspect)"
|
|
3760
|
+
},
|
|
3761
|
+
subCommands: {
|
|
3762
|
+
generate: generateCommand,
|
|
3763
|
+
fingerprint: fingerprintCommand
|
|
3764
|
+
}
|
|
3765
|
+
});
|
|
3766
|
+
|
|
3575
3767
|
//#endregion
|
|
3576
3768
|
//#region src/cli/commands/seed.ts
|
|
3577
3769
|
/**
|
|
@@ -3934,7 +4126,8 @@ const typesCommand = defineCommand({
|
|
|
3934
4126
|
* - dev: Run dev server with local D1
|
|
3935
4127
|
* - seed: Apply a seed file to the database
|
|
3936
4128
|
* - export-seed: Export database schema and content as a seed file
|
|
3937
|
-
* -
|
|
4129
|
+
* - secrets: Generate and inspect EmDash secrets (encryption keys, etc.)
|
|
4130
|
+
* - auth: [DEPRECATED] Generate auth secret (use `secrets` instead)
|
|
3938
4131
|
* - login/logout/whoami: Session management
|
|
3939
4132
|
* - content: Create, read, update, delete content
|
|
3940
4133
|
* - schema: Manage collections and fields
|
|
@@ -3957,6 +4150,7 @@ runMain(defineCommand({
|
|
|
3957
4150
|
doctor: doctorCommand,
|
|
3958
4151
|
seed: seedCommand,
|
|
3959
4152
|
"export-seed": exportSeedCommand,
|
|
4153
|
+
secrets: secretsCommand,
|
|
3960
4154
|
auth: authCommand,
|
|
3961
4155
|
login: loginCommand,
|
|
3962
4156
|
logout: logoutCommand,
|