diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fa57842f5..f633a6b74 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,6 +15,12 @@ jobs: - uses: actions/setup-node@v3 with: {node-version: '18', cache: 'yarn'} - run: yarn + - name: Check cycles for server target + continue-on-error: true + run: yarn cycles:server + - name: Check cycles for browser target + continue-on-error: true + run: yarn cycles:browser - run: yarn test - uses: nowsprinting/check-version-format-action@v3 id: version diff --git a/apps/demo/src/demo/PagePreview.tsx b/apps/demo/src/demo/PagePreview.tsx index 8e9962dde..120c1f131 100644 --- a/apps/demo/src/demo/PagePreview.tsx +++ b/apps/demo/src/demo/PagePreview.tsx @@ -1,5 +1,5 @@ import {Recipe} from '@/demo/Recipe' -import {Entry} from 'alinea/core' +import {Entry} from 'alinea/core/Entry' interface PagePreviewProps { entry: Entry diff --git a/apps/dev/content/primary/fields/fields.json b/apps/dev/content/primary/fields/fields.json index f16f6e97a..a23c2cc61 100644 --- a/apps/dev/content/primary/fields/fields.json +++ b/apps/dev/content/primary/fields/fields.json @@ -192,6 +192,7 @@ "withInitial": [ { "type": "paragraph", + "textAlign": "left", "content": [ { "type": "text", diff --git a/build.js b/build.js index 1f01d8843..1c454009e 100644 --- a/build.js +++ b/build.js @@ -128,6 +128,21 @@ const internalPlugin = { const cwd = process.cwd() const src = path.join(cwd, 'src') build.onResolve({filter: /^alinea\/.*/}, args => { + const checkCycles = process.env.CHECK_CYCLES + if (checkCycles) { + // Make this a relative path + const file = args.path.slice('alinea/'.length) + if (args.kind === 'entry-point') return + const localFile = path.join(src, file) + const target = + checkCycles === 'browser' ? BROWSER_TARGET : SERVER_TARGET + const targetFile = `${localFile}.${target}` + const hasTargetFile = fs.existsSync(`${targetFile}.tsx`) + const relative = hasTargetFile + ? `./${path.relative(args.resolveDir, targetFile)}.js` + : `./${path.relative(args.resolveDir, localFile)}.js` + return {path: relative, external: true} + } return {path: args.path, external: true} /*return build.resolve('./' + path.join('src', file), { kind: args.kind, diff --git a/package.json b/package.json index fc7699f81..820e52889 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,8 @@ "stories": "ladle serve", "demo": "node build.js --watch -- node dev.js --dir apps/demo --config src/cms -- yarn workspace @alinea/demo dev", "build": "tsc && node build.js", + "cycles:server": "CHECK_CYCLES=server node build.js && madge --circular dist/index.js", + "cycles:browser": "CHECK_CYCLES=browser node build.js && madge --circular dist/index.js", "alinea": "node build.js && node dist/cli.js", "build:alinea": "node build.js", "release:types": "tsc", @@ -75,6 +77,7 @@ "alinea": "link:.", "esbx": "^0.0.18", "glob": "^7.2.0", + "madge": "^6.1.0", "npm-run-all": "^4.1.5", "postcss-modules": "^6.0.0", "postcss-pxtorem": "^6.0.0", @@ -114,10 +117,10 @@ "browser": "./dist/core/media/MediaRoot.browser.js", "default": "./dist/core/media/MediaRoot.js" }, - "./core/media/MediaSchema": { - "worker": "./dist/core/media/MediaSchema.js", - "browser": "./dist/core/media/MediaSchema.browser.js", - "default": "./dist/core/media/MediaSchema.js" + "./core/media/MediaTypes": { + "worker": "./dist/core/media/MediaTypes.js", + "browser": "./dist/core/media/MediaTypes.browser.js", + "default": "./dist/core/media/MediaTypes.js" }, "./dashboard/view/Preview": { "worker": "./dist/dashboard/view/Preview.js", diff --git a/src/alinea.ts b/src/alinea.ts index fc82137cd..ab39bc4e8 100644 --- a/src/alinea.ts +++ b/src/alinea.ts @@ -1,20 +1,23 @@ // Config creation -export { - createConfig as config, - Meta as meta, - page, - root, - schema, - snippet, - track, - type, - workspace -} from 'alinea/core' +export {createConfig as config} from 'alinea/core/Config' +export {Meta as meta} from 'alinea/core/Meta' +export {page} from 'alinea/core/Page' +export {root} from 'alinea/core/Root' +export {schema} from 'alinea/core/Schema' +export {track} from 'alinea/core/Tracker' +export {type} from 'alinea/core/Type' +export {workspace} from 'alinea/core/Workspace' +export {snippet} from 'alinea/core/pages/Snippet' // Types -export {Root, Workspace} from 'alinea/core' -export type {Config, Infer, Schema, TextDoc, Type} from 'alinea/core' +export type {Config} from 'alinea/core/Config' +export type {Infer} from 'alinea/core/Infer' +export {Root} from 'alinea/core/Root' +export type {Schema} from 'alinea/core/Schema' +export type {TextDoc} from 'alinea/core/TextDoc' +export type {Type} from 'alinea/core/Type' +export {Workspace} from 'alinea/core/Workspace' export type { EntryReference, FileReference, @@ -23,8 +26,8 @@ export type { export type {UrlReference} from 'alinea/picker/url' // Helpers -export type {Infer as infer} from 'alinea/core' export {document} from 'alinea/core/Document' +export type {Infer as infer} from 'alinea/core/Infer' export {createMediaRoot as media} from 'alinea/core/media/MediaRoot' // Included inputs diff --git a/src/auth/passwordless.ts b/src/auth/passwordless.ts index cbc12aa37..25ab4d673 100644 --- a/src/auth/passwordless.ts +++ b/src/auth/passwordless.ts @@ -2,7 +2,7 @@ import { PasswordLessAuth, PasswordLessAuthOptions } from 'alinea/auth/passwordless/PasswordLessAuth' -import {Auth} from 'alinea/core' +import type {Auth} from 'alinea/core/Auth' import {PasswordLessLogin} from './passwordless/PasswordLessLogin.js' export type PasswordLess = PasswordLessAuthOptions diff --git a/src/auth/passwordless/PasswordLessAuth.server.ts b/src/auth/passwordless/PasswordLessAuth.server.ts index 7e1eb9591..b38e42c40 100644 --- a/src/auth/passwordless/PasswordLessAuth.server.ts +++ b/src/auth/passwordless/PasswordLessAuth.server.ts @@ -1,5 +1,10 @@ import {Route, router} from 'alinea/backend/router/Router' -import {Auth, Connection, HttpError, Outcome, User} from 'alinea/core' +import {Auth} from 'alinea/core/Auth' +import {Connection} from 'alinea/core/Connection' +import {HttpError} from 'alinea/core/HttpError' +import {Outcome} from 'alinea/core/Outcome' +import {User} from 'alinea/core/User' + import {sign, verify} from 'alinea/core/util/JWT' import type {Transporter} from 'nodemailer' import {assert, object, string} from 'superstruct' diff --git a/src/auth/passwordless/PasswordLessLogin.tsx b/src/auth/passwordless/PasswordLessLogin.tsx index 193ffff60..09f395e82 100644 --- a/src/auth/passwordless/PasswordLessLogin.tsx +++ b/src/auth/passwordless/PasswordLessLogin.tsx @@ -1,5 +1,7 @@ -import {Auth, Connection, Session} from 'alinea/core' +import {Auth} from 'alinea/core/Auth' import {Client} from 'alinea/core/Client' +import {Connection} from 'alinea/core/Connection' +import {Session} from 'alinea/core/Session' import {decode} from 'alinea/core/util/JWT' import {joinPaths} from 'alinea/core/util/Urls' import {useDashboard} from 'alinea/dashboard/hook/UseDashboard' diff --git a/src/backend/Database.test.ts b/src/backend/Database.test.ts index 2694db1d5..7f8edbee0 100644 --- a/src/backend/Database.test.ts +++ b/src/backend/Database.test.ts @@ -1,4 +1,6 @@ -import {Edit, EntryPhase, Query} from 'alinea/core' +import {Edit} from 'alinea/core/Edit' +import {EntryPhase} from 'alinea/core/EntryRow' +import {Query} from 'alinea/core/Query' import {createPreview} from 'alinea/core/media/CreatePreview' import {readFileSync} from 'fs' import {test} from 'uvu' diff --git a/src/backend/Database.ts b/src/backend/Database.ts index 9d8dd125e..a2a3f568f 100644 --- a/src/backend/Database.ts +++ b/src/backend/Database.ts @@ -1,25 +1,21 @@ -import { - Config, - EntryUrlMeta, - PageSeed, - Root, - Schema, - SyncResponse, - Syncable, - Type, - Workspace, - createId, - slugify, - unreachable -} from 'alinea/core' -import {entryInfo, entryUrl} from 'alinea/core/EntryFilenames' +import {Config} from 'alinea/core/Config' +import {SyncResponse, Syncable} from 'alinea/core/Connection' import {EntryRecord, META_KEY, createRecord} from 'alinea/core/EntryRecord' +import {createId} from 'alinea/core/Id' import {Mutation, MutationType} from 'alinea/core/Mutation' +import {PageSeed} from 'alinea/core/Page' +import {Root} from 'alinea/core/Root' +import {Schema} from 'alinea/core/Schema' +import {EntryUrlMeta, Type} from 'alinea/core/Type' +import {Workspace} from 'alinea/core/Workspace' import {createFileHash, createRowHash} from 'alinea/core/util/ContentHash' +import {entryInfo, entryUrl} from 'alinea/core/util/EntryFilenames' import {createEntryRow, publishEntryRow} from 'alinea/core/util/EntryRows' import {Logger} from 'alinea/core/util/Logger' import {entries} from 'alinea/core/util/Objects' import * as paths from 'alinea/core/util/Paths' +import {slugify} from 'alinea/core/util/Slugs' +import {unreachable} from 'alinea/core/util/Types' import {Driver, Expr, Select, alias, create} from 'rado' import {exists} from 'rado/sqlite' import xxhash from 'xxhash-wasm' diff --git a/src/backend/Drafts.ts b/src/backend/Drafts.ts index c5e9c5e0f..74634ac4d 100644 --- a/src/backend/Drafts.ts +++ b/src/backend/Drafts.ts @@ -1,4 +1,5 @@ -import {Connection, Draft} from 'alinea/core' +import {Connection} from 'alinea/core/Connection' +import {Draft} from 'alinea/core/Draft' export interface DraftTransport { entryId: string diff --git a/src/backend/Handler.ts b/src/backend/Handler.ts index acbf7b085..b20fa2a65 100644 --- a/src/backend/Handler.ts +++ b/src/backend/Handler.ts @@ -1,24 +1,23 @@ import {Request, Response} from '@alinea/iso' + +import {Auth} from 'alinea/core/Auth' +import {Config} from 'alinea/core/Config' +import {Connection, SyncResponse} from 'alinea/core/Connection' +import {parseYDoc} from 'alinea/core/Doc' +import {Draft} from 'alinea/core/Draft' +import {Entry} from 'alinea/core/Entry' +import {EntryRecord} from 'alinea/core/EntryRecord' +import {EntryPhase, EntryRow} from 'alinea/core/EntryRow' +import {EditMutation, Mutation, MutationType} from 'alinea/core/Mutation' import { - Auth, - Config, - Connection, - Draft, - Entry, - EntryPhase, - EntryRow, PreviewUpdate, ResolveDefaults, ResolveParams, - Resolver, - SyncResponse, - parseYDoc -} from 'alinea/core' -import {EntryRecord} from 'alinea/core/EntryRecord' -import {EditMutation, Mutation, MutationType} from 'alinea/core/Mutation' + Resolver +} from 'alinea/core/Resolver' import {createSelection} from 'alinea/core/pages/CreateSelection' import {Realm} from 'alinea/core/pages/Realm' -import {Selection} from 'alinea/core/pages/Selection' +import {Selection} from 'alinea/core/pages/ResolveData' import {base64, base64url} from 'alinea/core/util/Encoding' import {Logger, LoggerResult, Report} from 'alinea/core/util/Logger' import * as Y from 'alinea/yjs' diff --git a/src/backend/History.ts b/src/backend/History.ts index 9efc5628a..eb126d5b2 100644 --- a/src/backend/History.ts +++ b/src/backend/History.ts @@ -1,5 +1,6 @@ -import {Connection, User} from 'alinea/core' +import {Connection} from 'alinea/core/Connection' import {EntryRecord} from 'alinea/core/EntryRecord' +import {User} from 'alinea/core/User' export interface Revision { ref: string diff --git a/src/backend/Loader.ts b/src/backend/Loader.ts index 7210c0a0f..8d962234f 100644 --- a/src/backend/Loader.ts +++ b/src/backend/Loader.ts @@ -1,5 +1,5 @@ -import {Schema} from 'alinea/core' import {EntryRecord} from 'alinea/core/EntryRecord' +import {Schema} from 'alinea/core/Schema' export interface Loader { extension: string diff --git a/src/backend/Media.ts b/src/backend/Media.ts index 546fc2620..9e862f3a6 100644 --- a/src/backend/Media.ts +++ b/src/backend/Media.ts @@ -1,4 +1,5 @@ -import {Connection, EntryRow} from 'alinea/core' +import type {Connection} from 'alinea/core/Connection' +import type {EntryRow} from 'alinea/core/EntryRow' export interface Media { prepareUpload( diff --git a/src/backend/Pending.ts b/src/backend/Pending.ts index 553476807..61460f2b3 100644 --- a/src/backend/Pending.ts +++ b/src/backend/Pending.ts @@ -1,5 +1,5 @@ -import {Connection} from 'alinea/core' -import {Mutation} from 'alinea/core/Mutation' +import type {Connection} from 'alinea/core/Connection' +import type {Mutation} from 'alinea/core/Mutation' export interface Pending { pendingSince( diff --git a/src/backend/Previews.ts b/src/backend/Previews.ts index f793d3817..8b9375300 100644 --- a/src/backend/Previews.ts +++ b/src/backend/Previews.ts @@ -1,4 +1,4 @@ -import {User} from 'alinea/core' +import type {User} from 'alinea/core/User' export interface Previews { sign(data: User): Promise diff --git a/src/backend/Target.ts b/src/backend/Target.ts index 6745e307d..191f221eb 100644 --- a/src/backend/Target.ts +++ b/src/backend/Target.ts @@ -1,4 +1,4 @@ -import {Connection} from 'alinea/core' +import type {Connection} from 'alinea/core/Connection' export interface Target { mutate( diff --git a/src/backend/data/ChangeSet.ts b/src/backend/data/ChangeSet.ts index b5592d227..6a568f790 100644 --- a/src/backend/data/ChangeSet.ts +++ b/src/backend/data/ChangeSet.ts @@ -1,5 +1,6 @@ -import {Config, EntryPhase, EntryUrlMeta, Type, Workspace} from 'alinea/core' +import {Config} from 'alinea/core/Config' import {META_KEY, createRecord} from 'alinea/core/EntryRecord' +import {EntryPhase} from 'alinea/core/EntryRow' import { ArchiveMutation, CreateMutation, @@ -15,6 +16,8 @@ import { RemoveEntryMutation, UploadMutation } from 'alinea/core/Mutation' +import {EntryUrlMeta, Type} from 'alinea/core/Type' +import {Workspace} from 'alinea/core/Workspace' import {join} from 'alinea/core/util/Paths' import {JsonLoader} from '../loader/JsonLoader.js' diff --git a/src/backend/data/MemoryHandler.ts b/src/backend/data/MemoryHandler.ts index ae88fd652..6cee66730 100644 --- a/src/backend/data/MemoryHandler.ts +++ b/src/backend/data/MemoryHandler.ts @@ -1,5 +1,8 @@ -import {Config, Connection, Draft, createId} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Connection} from 'alinea/core/Connection' +import {Draft} from 'alinea/core/Draft' import {EntryRecord} from 'alinea/core/EntryRecord' +import {createId} from 'alinea/core/Id' import {Mutation} from 'alinea/core/Mutation' import {Database} from '../Database.js' import {Drafts} from '../Drafts.js' diff --git a/src/backend/loader/JsonLoader.ts b/src/backend/loader/JsonLoader.ts index ea1602f85..443531a3d 100644 --- a/src/backend/loader/JsonLoader.ts +++ b/src/backend/loader/JsonLoader.ts @@ -1,6 +1,6 @@ -import {Schema} from 'alinea/core' import {EntryRecord, META_KEY} from 'alinea/core/EntryRecord' -import {Loader} from '../Loader.js' +import type {Schema} from 'alinea/core/Schema' +import type {Loader} from '../Loader.js' const encoder = new TextEncoder() const decoder = new TextDecoder() diff --git a/src/backend/resolver/EntryResolver.ts b/src/backend/resolver/EntryResolver.ts index 65e034040..64b71fc26 100644 --- a/src/backend/resolver/EntryResolver.ts +++ b/src/backend/resolver/EntryResolver.ts @@ -1,19 +1,18 @@ +import {EntryPhase, EntryRow, EntryTable} from 'alinea/core/EntryRow' +import {EntrySearch} from 'alinea/core/EntrySearch' +import {Field} from 'alinea/core/Field' import { - Field, PreviewUpdate, ResolveDefaults, - ResolveParams, - Schema, - Type, - unreachable -} from 'alinea/core' -import {EntryPhase, EntryRow, EntryTable} from 'alinea/core/EntryRow' -import {EntrySearch} from 'alinea/core/EntrySearch' + ResolveParams +} from 'alinea/core/Resolver' +import {Schema} from 'alinea/core/Schema' +import {Type} from 'alinea/core/Type' import type * as pages from 'alinea/core/pages' -import {SourceType} from 'alinea/core/pages/Cursor' -import {BinaryOp, UnaryOp} from 'alinea/core/pages/ExprData' import {Realm} from 'alinea/core/pages/Realm' +import {BinaryOp, SourceType, UnaryOp} from 'alinea/core/pages/ResolveData' import {entries, fromEntries, keys} from 'alinea/core/util/Objects' +import {unreachable} from 'alinea/core/util/Types' import { BinOpType, Expr, diff --git a/src/backend/resolver/LinkResolver.ts b/src/backend/resolver/LinkResolver.ts index bf20c4b13..ca2f29454 100644 --- a/src/backend/resolver/LinkResolver.ts +++ b/src/backend/resolver/LinkResolver.ts @@ -1,6 +1,6 @@ -import {Entry} from 'alinea/core' +import {Entry} from 'alinea/core/Entry' import {createSelection} from 'alinea/core/pages/CreateSelection' -import {Projection} from 'alinea/core/pages/Projection' +import type {Projection} from 'alinea/core/pages/Projection' import {Realm} from 'alinea/core/pages/Realm' import {serializeSelection} from 'alinea/core/pages/Serialize' import DataLoader from 'dataloader' diff --git a/src/backend/test/Example.ts b/src/backend/test/Example.ts index a63103dac..a729a8139 100644 --- a/src/backend/test/Example.ts +++ b/src/backend/test/Example.ts @@ -1,7 +1,13 @@ -import {Entry, document, page, root, schema, type, workspace} from 'alinea/core' +import {document} from 'alinea/core/Document' +import {Entry} from 'alinea/core/Entry' +import {page} from 'alinea/core/Page' +import {root} from 'alinea/core/Root' +import {schema} from 'alinea/core/Schema' +import {type} from 'alinea/core/Type' +import {workspace} from 'alinea/core/Workspace' import {createTestCMS} from 'alinea/core/driver/TestDriver' import {createMediaRoot} from 'alinea/core/media/MediaRoot' -import {MediaFile, MediaLibrary} from 'alinea/core/media/MediaSchema' +import {MediaFile, MediaLibrary} from 'alinea/core/media/MediaTypes' import { check, code, diff --git a/src/backend/test/ExampleTypes.ts b/src/backend/test/ExampleTypes.ts index e39041506..cec2ce252 100644 --- a/src/backend/test/ExampleTypes.ts +++ b/src/backend/test/ExampleTypes.ts @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {path, tab, tabs, text} from 'alinea/field' export const TypeWithTabs = type('Type', { diff --git a/src/backend/util/JWTPreviews.ts b/src/backend/util/JWTPreviews.ts index 008b4ca1a..6e86a3ec3 100644 --- a/src/backend/util/JWTPreviews.ts +++ b/src/backend/util/JWTPreviews.ts @@ -1,4 +1,4 @@ -import {User} from 'alinea/core' +import {User} from 'alinea/core/User' import {sign, verify} from 'alinea/core/util/JWT' import {Previews} from '../Previews.js' diff --git a/src/cli/Init.ts b/src/cli/Init.ts index 414e75f99..ecaf2b570 100644 --- a/src/cli/Init.ts +++ b/src/cli/Init.ts @@ -1,4 +1,5 @@ -import {createId, outcome} from 'alinea/core' +import {createId} from 'alinea/core/Id' +import {outcome} from 'alinea/core/Outcome' import fs from 'node:fs/promises' import path from 'node:path' import {dirname} from './util/Dirname.js' diff --git a/src/cli/Serve.ts b/src/cli/Serve.ts index 0a092a770..f9e955208 100644 --- a/src/cli/Serve.ts +++ b/src/cli/Serve.ts @@ -3,8 +3,9 @@ import {Handler} from 'alinea/backend/Handler' import {HttpRouter} from 'alinea/backend/router/Router' import {createCloudDebugHandler} from 'alinea/cloud/server/CloudDebugHandler' import {createCloudHandler} from 'alinea/cloud/server/CloudHandler' -import {Auth, localUser} from 'alinea/core' +import {Auth} from 'alinea/core/Auth' import {CMS} from 'alinea/core/CMS' +import {localUser} from 'alinea/core/User' import {BuildOptions} from 'esbuild' import path from 'node:path' import simpleGit from 'simple-git' diff --git a/src/cli/generate/FillCache.ts b/src/cli/generate/FillCache.ts index f8426f4d6..cd4039e39 100644 --- a/src/cli/generate/FillCache.ts +++ b/src/cli/generate/FillCache.ts @@ -1,7 +1,7 @@ import {Database} from 'alinea/backend/Database' import {Store} from 'alinea/backend/Store' import {Emitter, createEmitter} from 'alinea/cli/util/Emitter' -import {Config} from 'alinea/core' +import {Config} from 'alinea/core/Config' import pLimit from 'p-limit' import {getCommitSha} from '../util/CommitSha.js' import {createWatcher} from '../util/Watcher.js' diff --git a/src/cli/generate/GenerateTypes.ts b/src/cli/generate/GenerateTypes.ts index f813ab801..ba525f8cd 100644 --- a/src/cli/generate/GenerateTypes.ts +++ b/src/cli/generate/GenerateTypes.ts @@ -1,6 +1,6 @@ -import {Type} from 'alinea/core' import {Config} from 'alinea/core/Config' import {Hint} from 'alinea/core/Hint' +import {Type} from 'alinea/core/Type' import {Code, code} from 'alinea/core/util/CodeGen' import {Lazy} from 'alinea/core/util/Lazy' diff --git a/src/cli/generate/LocalData.ts b/src/cli/generate/LocalData.ts index 46eae11f9..88dfa326c 100644 --- a/src/cli/generate/LocalData.ts +++ b/src/cli/generate/LocalData.ts @@ -1,17 +1,19 @@ import {JsonLoader, Media} from 'alinea/backend' import {FS} from 'alinea/backend/FS' -import {Connection, createId, slugify} from 'alinea/core' import {Config} from 'alinea/core/Config' +import {createId} from 'alinea/core/Id' import {outcome} from 'alinea/core/Outcome' import {Root} from 'alinea/core/Root' import {Workspace} from 'alinea/core/Workspace' import {entries, keys, values} from 'alinea/core/util/Objects' import * as path from 'alinea/core/util/Paths' +import {slugify} from 'alinea/core/util/Slugs' import {Source, SourceEntry, WatchFiles} from '../../backend/Source.js' import {Target} from '../../backend/Target.js' import {ChangeType} from '../../backend/data/ChangeSet.js' import {applyJsonPatch} from '../../backend/util/JsonPatch.js' +import {Connection} from 'alinea/core/Connection' import {basename, dirname, extname, join} from 'alinea/core/util/Paths' export interface LocalDataOptions { diff --git a/src/cli/serve/CreateLocalServer.ts b/src/cli/serve/CreateLocalServer.ts index 702510bea..3b85a8614 100644 --- a/src/cli/serve/CreateLocalServer.ts +++ b/src/cli/serve/CreateLocalServer.ts @@ -2,7 +2,8 @@ import {ReadableStream, Request, Response, TextEncoderStream} from '@alinea/iso' import {Handler} from 'alinea/backend' import {HttpRouter, router} from 'alinea/backend/router/Router' import {cloudUrl} from 'alinea/cloud/server/CloudConfig' -import {Trigger, User, trigger} from 'alinea/core' +import {Trigger, trigger} from 'alinea/core/Trigger' +import {User} from 'alinea/core/User' import esbuild, {BuildOptions, BuildResult, OutputFile} from 'esbuild' import fs from 'node:fs' import path from 'node:path' diff --git a/src/cli/serve/GitHistory.ts b/src/cli/serve/GitHistory.ts index a3737e6de..7a63e26ea 100644 --- a/src/cli/serve/GitHistory.ts +++ b/src/cli/serve/GitHistory.ts @@ -1,6 +1,6 @@ import {JsonLoader} from 'alinea/backend' import {History, Revision} from 'alinea/backend/History' -import {Config} from 'alinea/core' +import {Config} from 'alinea/core/Config' import {EntryRecord} from 'alinea/core/EntryRecord' import {join} from 'alinea/core/util/Paths' import {SimpleGit} from 'simple-git' diff --git a/src/cli/serve/MemoryDrafts.ts b/src/cli/serve/MemoryDrafts.ts index 40a530a5f..42fb0c0e8 100644 --- a/src/cli/serve/MemoryDrafts.ts +++ b/src/cli/serve/MemoryDrafts.ts @@ -1,5 +1,5 @@ import {Drafts} from 'alinea/backend/Drafts' -import {Draft} from 'alinea/core' +import {Draft} from 'alinea/core/Draft' export class MemoryDrafts implements Drafts { drafts = new Map() diff --git a/src/cloud/server/CloudAuthServer.ts b/src/cloud/server/CloudAuthServer.ts index 93fd77235..db2d029c3 100644 --- a/src/cloud/server/CloudAuthServer.ts +++ b/src/cloud/server/CloudAuthServer.ts @@ -1,15 +1,13 @@ import {fetch, Request, Response} from '@alinea/iso' import {Route, router} from 'alinea/backend/router/Router' -import { - Auth, - Config, - Connection, - HttpError, - outcome, - User, - Workspace -} from 'alinea/core' +import {Auth} from 'alinea/core/Auth' +import {Config} from 'alinea/core/Config' +import {Connection} from 'alinea/core/Connection' +import {HttpError} from 'alinea/core/HttpError' +import {outcome} from 'alinea/core/Outcome' +import {User} from 'alinea/core/User' import {verify} from 'alinea/core/util/JWT' +import {Workspace} from 'alinea/core/Workspace' import PLazy from 'p-lazy' import pkg from '../../../package.json' import {AuthResult, AuthResultType} from '../AuthResult.js' diff --git a/src/cloud/server/CloudDebugHandler.ts b/src/cloud/server/CloudDebugHandler.ts index 0c20a5afc..4620aa176 100644 --- a/src/cloud/server/CloudDebugHandler.ts +++ b/src/cloud/server/CloudDebugHandler.ts @@ -3,8 +3,11 @@ import {Drafts} from 'alinea/backend/Drafts' import {History, Revision} from 'alinea/backend/History' import {Pending} from 'alinea/backend/Pending' import {GitHistory} from 'alinea/cli/serve/GitHistory' -import {Config, Connection, Draft, createId} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Connection} from 'alinea/core/Connection' +import {Draft} from 'alinea/core/Draft' import {EntryRecord} from 'alinea/core/EntryRecord' +import {createId} from 'alinea/core/Id' import {Mutation} from 'alinea/core/Mutation' import simpleGit from 'simple-git' diff --git a/src/cloud/server/CloudHandler.ts b/src/cloud/server/CloudHandler.ts index b6d7aa489..76cff656d 100644 --- a/src/cloud/server/CloudHandler.ts +++ b/src/cloud/server/CloudHandler.ts @@ -3,8 +3,11 @@ import {Drafts} from 'alinea/backend/Drafts' import {History, Revision} from 'alinea/backend/History' import {Pending} from 'alinea/backend/Pending' import {ChangeSet} from 'alinea/backend/data/ChangeSet' -import {Config, Connection, Draft, HttpError} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Connection} from 'alinea/core/Connection' +import {Draft} from 'alinea/core/Draft' import {EntryRecord} from 'alinea/core/EntryRecord' +import {HttpError} from 'alinea/core/HttpError' import {Mutation} from 'alinea/core/Mutation' import {Outcome, OutcomeJSON} from 'alinea/core/Outcome' import {base64} from 'alinea/core/util/Encoding' diff --git a/src/cloud/view/CloudAuth.browser.tsx b/src/cloud/view/CloudAuth.browser.tsx index 5aad0c30b..4687e746d 100644 --- a/src/cloud/view/CloudAuth.browser.tsx +++ b/src/cloud/view/CloudAuth.browser.tsx @@ -1,6 +1,6 @@ -import {Connection} from 'alinea/core' import {Auth} from 'alinea/core/Auth' import {Client} from 'alinea/core/Client' +import {Connection} from 'alinea/core/Connection' import {joinPaths} from 'alinea/core/util/Urls' import {useDashboard} from 'alinea/dashboard/hook/UseDashboard' import {Head} from 'alinea/dashboard/util/Head' diff --git a/src/config.ts b/src/config.ts index 004eb772b..5d1d5f8d4 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,12 +1,12 @@ // Config creation -export { - createConfig as create, - page, - root, - schema, - track, - type, - workspace -} from './core.js' +export {createConfig as create} from './core/Config.js' export {document} from './core/Document.js' +export {Meta as meta} from './core/Meta.js' +export {page} from './core/Page.js' +export {root} from './core/Root.js' +export {schema} from './core/Schema.js' +export {track} from './core/Tracker.js' +export {type} from './core/Type.js' +export {workspace} from './core/Workspace.js' export {createMediaRoot as media} from './core/media/MediaRoot.js' +export {snippet} from './core/pages/Snippet.js' diff --git a/src/core.ts b/src/core.ts index 88e4918ac..75e5a95d1 100644 --- a/src/core.ts +++ b/src/core.ts @@ -1,48 +1,8 @@ export {createCMS} from 'alinea/core/driver/DefaultDriver' -export * from './core/Auth.js' -export * from './core/CMS.js' -export * from './core/Config.js' -export * from './core/Connection.js' -export * from './core/Doc.js' -export * from './core/Document.js' -export * from './core/Draft.js' -export * from './core/Edit.js' -export * from './core/Entry.js' -export * from './core/EntryRow.js' export * from './core/Field.js' -export * from './core/Future.js' export * from './core/Hint.js' -export * from './core/HttpError.js' -export * from './core/Id.js' -export * from './core/Infer.js' -export * from './core/Label.js' -export * from './core/Meta.js' -export * from './core/Outcome.js' -export * from './core/Page.js' -export * from './core/Picker.js' -export * from './core/Query.js' -export * from './core/Reference.js' -export * from './core/Resolver.js' -export * from './core/Root.js' -export * from './core/Schema.js' -export * from './core/Section.js' -export * from './core/Session.js' -export * from './core/Shape.js' -export * from './core/TextDoc.js' -export * from './core/Tracker.js' -export * from './core/Trigger.js' -export * from './core/Type.js' -export * from './core/User.js' -export * from './core/View.js' -export * from './core/Workspace.js' export * from './core/field/ListField.js' export * from './core/field/RecordField.js' export * from './core/field/RichTextField.js' export * from './core/field/ScalarField.js' export * from './core/field/UnionField.js' -export * from './core/pages/Snippet.js' -export * from './core/shape/ListShape.js' -export * from './core/shape/RichTextShape.js' -export * from './core/util/Async.js' -export * from './core/util/Slugs.js' -export * from './core/util/Types.js' diff --git a/src/core/CMS.ts b/src/core/CMS.ts index 183ee4252..f797ee2e2 100644 --- a/src/core/CMS.ts +++ b/src/core/CMS.ts @@ -61,8 +61,6 @@ export abstract class CMS extends GraphRealm { } export namespace CMS { - export const Link = Symbol.for('@alinea/CMS.Link') - export function instanceFor(attachment: Attachment): CMS { const cms = attached.get(attachment) if (!cms) throw new Error(`No CMS attached to ${attachment}`) diff --git a/src/core/Config.ts b/src/core/Config.ts index 27c492a56..7ef7b57bf 100644 --- a/src/core/Config.ts +++ b/src/core/Config.ts @@ -1,5 +1,5 @@ import {CloudAuthView} from 'alinea/cloud/view/CloudAuth' -import {MediaSchema} from 'alinea/core/media/MediaSchema' +import {MediaFile, MediaLibrary} from 'alinea/core/media/MediaTypes' import {ComponentType} from 'react' import {Auth} from './Auth.js' import {Entry} from './Entry.js' @@ -70,7 +70,7 @@ export function createConfig( const handlerUrl = definition.handlerUrl ?? definition.dashboard?.handlerUrl*/ return { ...definition, - schema: {...MediaSchema, ...definition.schema}, + schema: {MediaLibrary, MediaFile, ...definition.schema}, dashboard: { auth: CloudAuthView, ...definition.dashboard diff --git a/src/core/Graph.ts b/src/core/Graph.ts index 7714397ac..69f77b34c 100644 --- a/src/core/Graph.ts +++ b/src/core/Graph.ts @@ -7,9 +7,9 @@ import {Type} from './Type.js' import {Workspace} from './Workspace.js' import {createSelection} from './pages/CreateSelection.js' import {Cursor} from './pages/Cursor.js' -import {Projection} from './pages/Projection.js' +import type {Projection} from './pages/Projection.js' import {Realm} from './pages/Realm.js' -import {Selection} from './pages/Selection.js' +import {Selection} from './pages/ResolveData.js' import {seralizeLocation, serializeSelection} from './pages/Serialize.js' export type Location = Root | Workspace | PageSeed diff --git a/src/core/Query.ts b/src/core/Query.ts index 586c9e268..7d05562fe 100644 --- a/src/core/Query.ts +++ b/src/core/Query.ts @@ -1,8 +1,9 @@ import {Entry} from './Entry.js' import {Type} from './Type.js' -import {Cursor, SourceType} from './pages/Cursor.js' +import {Cursor} from './pages/Cursor.js' import {EV, Expr} from './pages/Expr.js' -import {Projection} from './pages/Projection.js' +import type {Projection} from './pages/Projection.js' +import {SourceType} from './pages/ResolveData.js' import {snippet as snippetHelper} from './pages/Snippet.js' /* diff --git a/src/core/Resolver.ts b/src/core/Resolver.ts index 7982fa8a2..53d06d5d7 100644 --- a/src/core/Resolver.ts +++ b/src/core/Resolver.ts @@ -1,6 +1,6 @@ import {EntryPhase} from './EntryRow.js' import {Realm} from './pages/Realm.js' -import {Selection} from './pages/Selection.js' +import {Selection} from './pages/ResolveData.js' export interface ResolveParams extends ResolveDefaults { selection: Selection diff --git a/src/core/Root.ts b/src/core/Root.ts index f9f00ff19..e47046d86 100644 --- a/src/core/Root.ts +++ b/src/core/Root.ts @@ -21,7 +21,7 @@ export interface RootDefinition { } export interface RootData extends RootMeta { - label: Label + label: string } type Seed = Record diff --git a/src/core/Transaction.ts b/src/core/Transaction.ts index d6519f248..4ae13070d 100644 --- a/src/core/Transaction.ts +++ b/src/core/Transaction.ts @@ -1,15 +1,8 @@ import {Blob, File} from '@alinea/iso' import {ImagePreviewDetails} from 'alinea/core/media/CreatePreview' -import {CMS} from './CMS.js' +import type {CMS} from './CMS.js' import {Config} from './Config.js' import {Entry} from './Entry.js' -import { - entryChildrenDir, - entryFileName, - entryFilepath, - entryUrl, - workspaceMediaDir -} from './EntryFilenames.js' import {EntryPhase, EntryRow} from './EntryRow.js' import {GraphRealm} from './Graph.js' import {HttpError} from './HttpError.js' @@ -21,6 +14,13 @@ import {EntryUrlMeta, Type, TypeI} from './Type.js' import {Workspace} from './Workspace.js' import {isImage} from './media/IsImage.js' import {createFileHash} from './util/ContentHash.js' +import { + entryChildrenDir, + entryFileName, + entryFilepath, + entryUrl, + workspaceMediaDir +} from './util/EntryFilenames.js' import {createEntryRow, entryParentPaths} from './util/EntryRows.js' import {basename, extname, join, normalize} from './util/Paths.js' import {slugify} from './util/Slugs.js' diff --git a/src/core/Type.test.ts b/src/core/Type.test.ts index 6ec25f1b7..89cdbc1f5 100644 --- a/src/core/Type.test.ts +++ b/src/core/Type.test.ts @@ -1,4 +1,4 @@ -import {Type, type} from 'alinea/core' +import {Type, type} from 'alinea/core/Type' import {list, richText, text} from 'alinea/field' import {test} from 'uvu' import * as assert from 'uvu/assert' diff --git a/src/core/Type.ts b/src/core/Type.ts index 48a0e4e78..a7ef63aff 100644 --- a/src/core/Type.ts +++ b/src/core/Type.ts @@ -8,10 +8,14 @@ import {Label} from './Label.js' import {Meta, StripMeta} from './Meta.js' import {Section, section} from './Section.js' import type {View} from './View.js' -import {createExprData} from './pages/CreateExprData.js' import {Cursor} from './pages/Cursor.js' -import {Expr} from './pages/Expr.js' -import {BinaryOp, ExprData} from './pages/ExprData.js' +import {Expr, createExprData} from './pages/Expr.js' +import { + BinaryOp, + ExprData, + Selection, + toSelection +} from './pages/ResolveData.js' import {RecordShape} from './shape/RecordShape.js' import { assign, @@ -41,7 +45,7 @@ export interface TypeMeta { icon?: ComponentType /** A React component used to view an entry of this type in the dashboard */ - view?: ComponentType + view?: ComponentType /** A React component used to view a row of this type in the dashboard */ summaryRow?: View /** A React component used to view a thumbnail of this type in the dashboard */ @@ -67,6 +71,7 @@ export class TypeTarget {} export declare class TypeI { get [Type.Data](): TypeData + [toSelection](): Selection.Row } export interface TypeI extends Callable { @@ -264,6 +269,12 @@ class TypeInstance implements TypeData { value: this, enumerable: false }) + defineProperty(instance, toSelection, { + value: () => { + return Selection.Row({type: Type.target(this.target)}) + }, + enumerable: false + }) } } diff --git a/src/core/View.ts b/src/core/View.ts index e096a7353..82891bff4 100644 --- a/src/core/View.ts +++ b/src/core/View.ts @@ -1,10 +1,10 @@ import type {ComponentType} from 'react' import {Entry} from './Entry.js' -import {Schema} from './Schema.js' +import type {Schema} from './Schema.js' import {Type} from './Type.js' import {createSelection} from './pages/CreateSelection.js' -import {Projection} from './pages/Projection.js' -import {Selection} from './pages/Selection.js' +import type {Projection} from './pages/Projection.js' +import type {Selection} from './pages/ResolveData.js' import {assign, entries} from './util/Objects.js' type ViewSelection = () => S diff --git a/src/core/Workspace.ts b/src/core/Workspace.ts index 0dd1fbb8a..aa76d22c5 100644 --- a/src/core/Workspace.ts +++ b/src/core/Workspace.ts @@ -1,5 +1,4 @@ import type {ComponentType} from 'react' -import {CMS} from './CMS.js' import {Label} from './Label.js' import {Meta, StripMeta} from './Meta.js' import {Root} from './Root.js' @@ -32,7 +31,6 @@ export interface WorkspaceDefinition { export type Workspace = Definition & { [Workspace.Data]: WorkspaceData - [CMS.Link]?: CMS } export namespace Workspace { diff --git a/src/core/media/MediaSchema.browser.tsx b/src/core/media/MediaSchema.browser.tsx deleted file mode 100644 index ffbc08db1..000000000 --- a/src/core/media/MediaSchema.browser.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import {IcRoundPermMedia} from 'alinea/ui/icons/IcRoundPermMedia' -import {MediaExplorer} from '../../dashboard/view/MediaExplorer.js' -import {FileEntry} from '../../dashboard/view/media/FileEntry.js' -import { - FileSummaryRow, - FileSummaryThumb -} from '../../dashboard/view/media/FileSummary.js' -import {type} from '../Type.js' -import * as config from './MediaSchema.js' - -export type MediaLibrary = config.MediaLibrary -export const MediaLibrary: typeof config.MediaLibrary = type( - 'Media directory', - { - isContainer: true, - contains: ['MediaLibrary'], - view: MediaExplorer, - icon: IcRoundPermMedia, - fields: { - ...config.MediaLibrary - } - } -) - -export type MediaFile = config.MediaFile -export const MediaFile: typeof config.MediaFile = type('File', { - isHidden: true, - summaryRow: FileSummaryRow, - summaryThumb: FileSummaryThumb, - view: FileEntry, - fields: { - ...config.MediaFile - } -}) - -export const MediaSchema = { - MediaLibrary, - MediaFile -} diff --git a/src/core/media/MediaTypes.browser.tsx b/src/core/media/MediaTypes.browser.tsx new file mode 100644 index 000000000..44f7b94ad --- /dev/null +++ b/src/core/media/MediaTypes.browser.tsx @@ -0,0 +1,61 @@ +import {MediaExplorer} from 'alinea/dashboard/view/MediaExplorer' +import {FileEntry} from 'alinea/dashboard/view/media/FileEntry' +import { + FileSummaryRow, + FileSummaryThumb +} from 'alinea/dashboard/view/media/FileSummary' +import {IcRoundPermMedia} from 'alinea/ui/icons/IcRoundPermMedia' +import {Entry} from '../Entry.js' +import {Query} from '../Query.js' +import {type} from '../Type.js' +import {view} from '../View.js' +import * as config from './MediaTypes.js' + +export function fileSummarySelect() { + return { + entryId: Entry.entryId, + i18nId: Entry.i18nId, + type: Entry.type, + workspace: Entry.workspace, + root: Entry.root, + title: Entry.title, + extension: MediaFile.extension, + size: MediaFile.size, + preview: MediaFile.preview, + thumbHash: MediaFile.thumbHash, + averageColor: MediaFile.averageColor, + focus: MediaFile.focus, + width: MediaFile.width, + height: MediaFile.height, + parents: Query.parents().select({ + entryId: Entry.entryId, + i18nId: Entry.i18nId, + title: Entry.title + }) + } +} + +export type MediaLibrary = config.MediaLibrary +export const MediaLibrary: typeof config.MediaLibrary = type( + 'Media directory', + { + isContainer: true, + contains: ['MediaLibrary'], + view: MediaExplorer, + icon: IcRoundPermMedia, + fields: { + ...config.MediaLibrary + } + } +) + +export type MediaFile = config.MediaFile +export const MediaFile: typeof config.MediaFile = type('File', { + isHidden: true, + summaryRow: view(fileSummarySelect, FileSummaryRow), + summaryThumb: view(fileSummarySelect, FileSummaryThumb), + view: FileEntry as any, + fields: { + ...config.MediaFile + } +}) diff --git a/src/core/media/MediaSchema.tsx b/src/core/media/MediaTypes.ts similarity index 79% rename from src/core/media/MediaSchema.tsx rename to src/core/media/MediaTypes.ts index 8266be650..2202384d7 100644 --- a/src/core/media/MediaSchema.tsx +++ b/src/core/media/MediaTypes.ts @@ -1,6 +1,4 @@ import {hidden} from 'alinea/field/hidden' -import {path} from 'alinea/field/path' -import {text} from 'alinea/field/text' import {Hint} from '../Hint.js' import {Type, type} from '../Type.js' @@ -9,17 +7,17 @@ export const MediaLibrary = type('Media directory', { isContainer: true, contains: ['MediaLibrary'], fields: { - title: text('Title'), - path: path('Path') + title: hidden('Title', Hint.String()), + path: hidden('Path', Hint.String()) } }) export type MediaFile = Type.Infer -export const MediaFile = type('File', { +export const MediaFile = type('Media file', { isHidden: true, fields: { - title: text('Title'), - path: path('Path'), + title: hidden('Title', Hint.String()), + path: hidden('Path', Hint.String()), location: hidden('Location', Hint.String()), extension: hidden('Extension', Hint.String()), size: hidden('File size', Hint.Number()), @@ -38,8 +36,3 @@ export const MediaFile = type('File', { thumbHash: hidden('Blur hash', Hint.String()) } }) - -export const MediaSchema = { - MediaLibrary, - MediaFile -} diff --git a/src/core/pages/CreateExprData.ts b/src/core/pages/CreateExprData.ts deleted file mode 100644 index 8b1378917..000000000 --- a/src/core/pages/CreateExprData.ts +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/core/pages/CreateSelection.ts b/src/core/pages/CreateSelection.ts index b437489f6..a85aea3ec 100644 --- a/src/core/pages/CreateSelection.ts +++ b/src/core/pages/CreateSelection.ts @@ -1,32 +1,16 @@ -import {Type} from '../Type.js' -import {Cursor} from './Cursor.js' -import {Expr} from './Expr.js' -import {ExprData} from './ExprData.js' -import {Selection} from './Selection.js' -import {Target} from './Target.js' -import {Tree} from './Tree.js' +import {Tree} from './Cursor.js' +import {ExprData, Selection, toSelection} from './ResolveData.js' export function createSelection(input: any) { - return Type.isType(input) ? fromInput(input()) : fromInput(input) + return fromInput(input) } function fromInput(input: any, parent?: any, level = 0): Selection { if (input === null || input === undefined) return Selection.Expr(ExprData.Value(null)) - if (Cursor.isCursor(input)) return Selection.Cursor(input[Cursor.Data]) - if (Expr.hasExpr(input)) input = input[Expr.ToExpr]() - if (Expr.isExpr(input)) return Selection.Expr(input[Expr.Data]) - if (Type.isType(input)) return Selection.Row({type: Type.target(input)}) - if (Target.isTarget(input)) return Selection.Row(input[Target.Data]) + if (input[toSelection]) return input[toSelection]() if (typeof input === 'function') { - const self = new Proxy(parent, { - get(_, prop) { - const res = parent[prop] - if (Expr.isExpr(res)) return Selection.Expr(res[Expr.Data], true) - return res - } - }) - return fromInput(input.call(self, new Tree(/*sourceId*/)), level) + return fromInput(input.call(parent, new Tree(/*sourceId*/)), level) } if (input && typeof input === 'object' && !Array.isArray(input)) { const keys = Object.keys(input) diff --git a/src/core/pages/Cursor.ts b/src/core/pages/Cursor.ts index a679c1bea..be74bee2b 100644 --- a/src/core/pages/Cursor.ts +++ b/src/core/pages/Cursor.ts @@ -1,62 +1,22 @@ -import {array, boolean, enums, number, object, string} from 'cito' -import {Type} from '../Type.js' +import {Entry} from '../Entry.js' +import type {Type} from '../Type.js' import {entries} from '../util/Objects.js' -import {createExprData} from './CreateExprData.js' import {createSelection} from './CreateSelection.js' import type {Condition} from './Expr.js' -import {EV, Expr, HasExpr} from './Expr.js' -import {BinaryOp, ExprData} from './ExprData.js' -import {Projection} from './Projection.js' -import {Selection} from './Selection.js' -import {TargetData} from './TargetData.js' - -export enum OrderDirection { - Asc = 'Asc', - Desc = 'Desc' -} - -export type OrderBy = typeof OrderBy.infer -export const OrderBy = object( - class { - expr = ExprData.adt - order = enums(OrderDirection) - } -) - -export type CursorData = typeof CursorData.infer -export const CursorData = object( - class { - target? = TargetData.optional - where? = ExprData.adt.optional - searchTerms? = array(string).optional - skip? = number.optional - take? = number.optional - orderBy? = array(OrderBy).optional - groupBy? = array(ExprData.adt).optional - select? = Selection.adt.optional - first? = boolean.optional - source? = CursorSource.optional - } -) - -export enum SourceType { - Children = 'Children', - Siblings = 'Siblings', - Translations = 'Translations', - Parents = 'Parents', - Parent = 'Parent', - Next = 'Next', - Previous = 'Previous' -} - -export type CursorSource = typeof CursorSource.infer -export const CursorSource = object( - class { - type = enums(SourceType) - // id = string - depth? = number.optional - } -) +import {EV, Expr, HasExpr, createExprData} from './Expr.js' +import type {Projection} from './Projection.js' +import { + BinaryOp, + CursorData, + ExprData, + OrderBy, + Selection, + SourceType, + targetData, + toExpr, + toSelection +} from './ResolveData.js' +import type {TargetI} from './Target.js' export interface Cursor { [Cursor.Data]: CursorData @@ -70,12 +30,6 @@ export class Cursor implements HasExpr { this[Cursor.Data] = data } - [Expr.ToExpr]() { - // Todo: this has to take target into account - const {where} = this[Cursor.Data] - return Expr(where ?? ExprData.Value(true)) - } - protected with(data: Partial): CursorData { return {...this[Cursor.Data], ...data} } @@ -84,6 +38,16 @@ export class Cursor implements HasExpr { return Boolean(input && input[Cursor.Data]) } + [toExpr]() { + // Todo: this has to take target into account + const {where} = this[Cursor.Data] + return Expr(where ?? ExprData.Value(true)) + } + + [toSelection]() { + return Selection.Cursor(this[Cursor.Data]) + } + toJSON() { return this[Cursor.Data] } @@ -266,3 +230,77 @@ export namespace Cursor { } } } + +type Narrow = Cursor.Find | TargetI +type Output = [Narrow] extends [T] ? Entry : Selection.Infer + +export class Tree { + constructor(/*protected sourceId: string*/) { + this.children = this.children.bind(this) + this.parents = this.parents.bind(this) + } + + protected narrowData(narrow?: any): Partial { + return ( + narrow && + (Cursor.isCursor(narrow) + ? narrow[Cursor.Data] + : {target: narrow[targetData]}) + ) + } + + protected find( + sourceType: SourceType, + narrow?: any, + depth?: number + ): Cursor.Find { + return new Cursor.Find({ + ...this.narrowData(narrow), + source: {type: sourceType, depth} + }) + } + + protected get(sourceType: SourceType, narrow?: any): Cursor.Get { + return new Cursor.Get({ + ...this.narrowData(narrow), + first: true, + source: {type: sourceType} + }) + } + + children(depth?: number): Cursor.Find> + children(narrow?: N, depth?: number): Cursor.Find> + children( + narrow?: N | number, + depth?: number + ): Cursor.Find> { + ;[narrow, depth] = + typeof narrow === 'number' ? [undefined, narrow] : [narrow, depth || 1] + return this.find(SourceType.Children, narrow, depth) + } + parents(depth?: number): Cursor.Find> + parents(narrow?: N, depth?: number): Cursor.Find> + parents( + narrow?: N | number, + depth?: number + ): Cursor.Find> { + ;[narrow, depth] = + typeof narrow === 'number' ? [undefined, narrow] : [narrow, depth] + return this.find(SourceType.Parents, narrow, depth) + } + previous = (narrow?: N): Cursor.Get> => { + return this.get(SourceType.Previous, narrow) + } + next = (narrow?: N): Cursor.Get> => { + return this.get(SourceType.Next, narrow) + } + parent = (narrow?: N): Cursor.Get> => { + return this.get(SourceType.Parent, narrow) + } + siblings = (narrow?: N): Cursor.Find> => { + return this.find(SourceType.Siblings, narrow) + } + translations = (includeSelf = false): Cursor.Find => { + return this.find(SourceType.Translations) + } +} diff --git a/src/core/pages/Expr.ts b/src/core/pages/Expr.ts index 9b1c5ff25..c97298c7a 100644 --- a/src/core/pages/Expr.ts +++ b/src/core/pages/Expr.ts @@ -1,9 +1,17 @@ -import {createExprData} from './CreateExprData.js' +import {entries, fromEntries} from '../util/Objects.js' import {createSelection} from './CreateSelection.js' -import {Cursor, OrderBy, OrderDirection} from './Cursor.js' -import {BinaryOp, ExprData, UnaryOp} from './ExprData.js' -import {Projection} from './Projection.js' -import type {Selection} from './Selection.js' +import {Cursor} from './Cursor.js' +import type {Projection} from './Projection.js' +import { + BinaryOp, + ExprData, + OrderBy, + OrderDirection, + Selection, + UnaryOp, + toExpr, + toSelection +} from './ResolveData.js' /** Expression or value of type T */ export type EV = Expr | T @@ -16,7 +24,7 @@ export function Expr(expr: ExprData): Expr { } export interface HasExpr { - [Expr.ToExpr](): Expr + [toExpr](): Expr } export interface ExprI { @@ -278,6 +286,10 @@ export class ExprI { toJSON() { return this[Expr.Data] } + + [toSelection]() { + return Selection.Expr(this[Expr.Data]) + } } export class CaseBuilder { @@ -312,7 +324,6 @@ export class CaseBuilder { export namespace Expr { export const Data = Symbol.for('@alinea/Expr.Data') export const ExprRef = Symbol.for('@alinea/Expr.ExprRef') - export const ToExpr = Symbol.for('@alinea/Expr.ToExpr') export const NULL = create(null) /*export function value(value: T): Expr { @@ -320,7 +331,7 @@ export namespace Expr { }*/ export function create(input: EV): Expr { - if (hasExpr(input)) return input[Expr.ToExpr]() + if (hasExpr(input)) return input[toExpr]() if (isExpr(input)) return input return Expr(ExprData.Value(input)) } @@ -329,7 +340,7 @@ export namespace Expr { return ( input && (typeof input === 'function' || typeof input === 'object') && - input[Expr.ToExpr] + input[toExpr] ) } @@ -361,3 +372,16 @@ export namespace Expr { ) } } + +export function createExprData(input: any): ExprData { + if (input === null || input === undefined) return ExprData.Value(null) + if (Expr.hasExpr(input)) input = input[toExpr]() + if (Expr.isExpr(input)) return input[Expr.Data] + if (input && typeof input === 'object' && !Array.isArray(input)) + return ExprData.Record( + fromEntries( + entries(input).map(([key, value]) => [key, createExprData(value)]) + ) + ) + return ExprData.Value(input) +} diff --git a/src/core/pages/ExprData.ts b/src/core/pages/ExprData.ts deleted file mode 100644 index 28b81aac7..000000000 --- a/src/core/pages/ExprData.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { - Infer, - Type, - any, - array, - enums, - literal, - record, - string, - tuple, - union -} from 'cito' -import {Selection} from './Selection.js' -import {TargetData} from './TargetData.js' - -export enum UnaryOp { - Not = 'Not', - IsNull = 'IsNull' -} - -export enum BinaryOp { - Add = 'Add', - Subt = 'Subt', - Mult = 'Mult', - Mod = 'Mod', - Div = 'Div', - Greater = 'Greater', - GreaterOrEqual = 'GreaterOrEqual', - Less = 'Less', - LessOrEqual = 'LessOrEqual', - Equals = 'Equals', - NotEquals = 'NotEquals', - And = 'And', - Or = 'Or', - Like = 'Like', - In = 'In', - NotIn = 'NotIn', - Concat = 'Concat' -} - -export type ExprData = - | ExprData.UnOp - | ExprData.BinOp - | ExprData.Field - | ExprData.Access - | ExprData.Value - | ExprData.Record - | ExprData.Case - | ExprData.Call - -export namespace ExprData { - namespace types { - export class UnOp { - type = literal('unop') - op = enums(UnaryOp) - expr = adt - } - export class BinOp { - type = literal('binop') - a = adt - op = enums(BinaryOp) - b = adt - } - export class Field { - type = literal('field') - target = TargetData - field = string - } - export class Access { - type = literal('access') - expr = adt - field = string - } - export class Value { - type = literal('value') - value = any - } - export class Record { - type = literal('record') - fields = record(adt) - } - export class Case { - type = literal('case') - expr = adt - cases = array(tuple(adt, Selection.adt)) - defaultCase? = Selection.adt.optional - } - export class Call { - type = literal('call') - method = string - args = array(adt) - } - } - export interface UnOp extends Infer {} - export function UnOp(op: UnaryOp, expr: ExprData): ExprData { - return {type: 'unop', op, expr} - } - export interface BinOp extends Infer {} - export function BinOp(a: ExprData, op: BinaryOp, b: ExprData): ExprData { - return {type: 'binop', a, op, b} - } - export interface Field extends Infer {} - export function Field(target: TargetData, field: string): ExprData { - return {type: 'field', target, field} - } - export interface Access extends Infer {} - export function Access(expr: ExprData, field: string): ExprData { - return {type: 'access', expr, field} - } - export interface Value extends Infer {} - export function Value(value: any): ExprData { - return {type: 'value', value} - } - export interface Record extends Infer {} - export function Record(fields: {[k: string]: ExprData}): ExprData { - return {type: 'record', fields} - } - export interface Case extends Infer {} - export function Case( - expr: ExprData, - cases: Array<[ExprData, Selection]>, - defaultCase?: Selection - ): ExprData { - return {type: 'case', expr, cases, defaultCase} - } - export interface Call extends Infer {} - export function Call(method: string, args: Array): ExprData { - return {type: 'call', method, args} - } - export const adt: Type = union( - types.UnOp, - types.BinOp, - types.Field, - types.Access, - types.Value, - types.Record, - types.Case, - types.Call - ) -} diff --git a/src/core/pages/Projection.ts b/src/core/pages/Projection.ts index c38b427c2..20ec7ef90 100644 --- a/src/core/pages/Projection.ts +++ b/src/core/pages/Projection.ts @@ -1,8 +1,8 @@ import {Type} from '../Type.js' +import type {Tree} from './Cursor.js' import {Cursor} from './Cursor.js' import {Expr} from './Expr.js' import {Target} from './Target.js' -import {Tree} from './Tree.js' interface ProjectionRecord { [key: string]: ((tree: Tree) => PageProjection) | Projection diff --git a/src/core/pages/ResolveData.ts b/src/core/pages/ResolveData.ts new file mode 100644 index 000000000..0ee813787 --- /dev/null +++ b/src/core/pages/ResolveData.ts @@ -0,0 +1,261 @@ +import * as cito from 'cito' +import {TypeTarget} from '../Type.js' +import {Expand} from '../util/Types.js' +import type {Projection} from './Projection.js' + +export type Selection = + | Selection.Row + | Selection.Record + | Selection.Cursor + | Selection.Expr + | Selection.Count + +export namespace Selection { + namespace types { + export class Row { + type = cito.literal('row') + target = TargetData + } + export class Record { + type = cito.literal('record') + fields = cito.array( + cito.union(cito.tuple(cito.string, adt), cito.tuple(TargetData)) + ) + } + export class Cursor { + type = cito.literal('cursor') + cursor = CursorData + } + export class Expr { + type = cito.literal('expr') + expr = ExprData.adt + fromParent = cito.boolean + } + export class Count { + type = cito.literal('count') + } + } + export interface Row extends cito.Infer {} + export function Row(target: TargetData): Selection.Row { + return {type: 'row', target} + } + export interface Record extends cito.Infer {} + export function Record( + fields: Array<[string, Selection] | [TargetData]> + ): Selection.Record { + return {type: 'record', fields} + } + export interface Cursor extends cito.Infer {} + export function Cursor(cursor: CursorData): Selection.Cursor { + return {type: 'cursor', cursor} + } + export interface Expr extends cito.Infer {} + export function Expr(expr: ExprData, fromParent = false): Selection.Expr { + return {type: 'expr', expr, fromParent} + } + export interface Count extends cito.Infer {} + export function Count(): Selection.Count { + return {type: 'count'} + } + export const adt: cito.Type = cito.union( + types.Row, + types.Record, + types.Cursor, + types.Expr, + types.Count + ) + + export type Infer = Projection.Infer + export type Combine = Expand> & Infer> +} + +export enum OrderDirection { + Asc = 'Asc', + Desc = 'Desc' +} + +export type OrderBy = typeof OrderBy.infer +export const OrderBy = cito.object( + class { + expr = ExprData.adt + order = cito.enums(OrderDirection) + } +) + +export type CursorData = typeof CursorData.infer +export const CursorData = cito.object( + class { + target? = TargetData.optional + where? = ExprData.adt.optional + searchTerms? = cito.array(cito.string).optional + skip? = cito.number.optional + take? = cito.number.optional + orderBy? = cito.array(OrderBy).optional + groupBy? = cito.array(ExprData.adt).optional + select? = Selection.adt.optional + first? = cito.boolean.optional + source? = CursorSource.optional + } +) + +export enum SourceType { + Children = 'Children', + Siblings = 'Siblings', + Translations = 'Translations', + Parents = 'Parents', + Parent = 'Parent', + Next = 'Next', + Previous = 'Previous' +} + +export type CursorSource = typeof CursorSource.infer +export const CursorSource = cito.object( + class { + type = cito.enums(SourceType) + // id = string + depth? = cito.number.optional + } +) + +export enum UnaryOp { + Not = 'Not', + IsNull = 'IsNull' +} + +export enum BinaryOp { + Add = 'Add', + Subt = 'Subt', + Mult = 'Mult', + Mod = 'Mod', + Div = 'Div', + Greater = 'Greater', + GreaterOrEqual = 'GreaterOrEqual', + Less = 'Less', + LessOrEqual = 'LessOrEqual', + Equals = 'Equals', + NotEquals = 'NotEquals', + And = 'And', + Or = 'Or', + Like = 'Like', + In = 'In', + NotIn = 'NotIn', + Concat = 'Concat' +} + +export type ExprData = + | ExprData.UnOp + | ExprData.BinOp + | ExprData.Field + | ExprData.Access + | ExprData.Value + | ExprData.Record + | ExprData.Case + | ExprData.Call + +export namespace ExprData { + namespace types { + export class UnOp { + type = cito.literal('unop') + op = cito.enums(UnaryOp) + expr = adt + } + export class BinOp { + type = cito.literal('binop') + a = adt + op = cito.enums(BinaryOp) + b = adt + } + export class Field { + type = cito.literal('field') + target = TargetData + field = cito.string + } + export class Access { + type = cito.literal('access') + expr = adt + field = cito.string + } + export class Value { + type = cito.literal('value') + value = cito.any + } + export class Record { + type = cito.literal('record') + fields = cito.record(adt) + } + export class Case { + type = cito.literal('case') + expr = adt + cases = cito.array(cito.tuple(adt, Selection.adt)) + defaultCase? = Selection.adt.optional + } + export class Call { + type = cito.literal('call') + method = cito.string + args = cito.array(adt) + } + } + export interface UnOp extends cito.Infer {} + export function UnOp(op: UnaryOp, expr: ExprData): ExprData { + return {type: 'unop', op, expr} + } + export interface BinOp extends cito.Infer {} + export function BinOp(a: ExprData, op: BinaryOp, b: ExprData): ExprData { + return {type: 'binop', a, op, b} + } + export interface Field extends cito.Infer {} + export function Field(target: TargetData, field: string): ExprData { + return {type: 'field', target, field} + } + export interface Access extends cito.Infer {} + export function Access(expr: ExprData, field: string): ExprData { + return {type: 'access', expr, field} + } + export interface Value extends cito.Infer {} + export function Value(value: any): ExprData { + return {type: 'value', value} + } + export interface Record extends cito.Infer {} + export function Record(fields: {[k: string]: ExprData}): ExprData { + return {type: 'record', fields} + } + export interface Case extends cito.Infer {} + export function Case( + expr: ExprData, + cases: Array<[ExprData, Selection]>, + defaultCase?: Selection + ): ExprData { + return {type: 'case', expr, cases, defaultCase} + } + export interface Call extends cito.Infer {} + export function Call(method: string, args: Array): ExprData { + return {type: 'call', method, args} + } + export const adt: cito.Type = cito.union( + types.UnOp, + types.BinOp, + types.Field, + types.Access, + types.Value, + types.Record, + types.Case, + types.Call + ) +} + +const TT = cito.type( + (value): value is TypeTarget => value && typeof value === 'object' +) + +export type TargetData = typeof TargetData.infer +export const TargetData = cito.object( + class { + name? = cito.string.optional + // alias? = string.optional + type? = TT.optional + } +) + +export const toSelection = Symbol.for('@alinea/toSelection') +export const toExpr = Symbol.for('@alinea/toExpr') +export const targetData = Symbol.for('@alinea/targetData') diff --git a/src/core/pages/Selection.ts b/src/core/pages/Selection.ts deleted file mode 100644 index fa33b6b72..000000000 --- a/src/core/pages/Selection.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { - Infer as CInfer, - Type as CType, - array, - boolean, - literal, - string, - tuple, - union -} from 'cito' -import {Expand} from '../util/Types.js' -import {CursorData} from './Cursor.js' -import {ExprData} from './ExprData.js' -import {Projection} from './Projection.js' -import {TargetData} from './TargetData.js' - -export type Selection = - | Selection.Row - | Selection.Record - | Selection.Cursor - | Selection.Expr - | Selection.Count - -export namespace Selection { - namespace types { - export class Row { - type = literal('row') - target = TargetData - } - export class Record { - type = literal('record') - fields = array(union(tuple(string, adt), tuple(TargetData))) - } - export class Cursor { - type = literal('cursor') - cursor = CursorData - } - export class Expr { - type = literal('expr') - expr = ExprData.adt - fromParent = boolean - } - export class Count { - type = literal('count') - } - } - export interface Row extends CInfer {} - export function Row(target: TargetData): Selection.Row { - return {type: 'row', target} - } - export interface Record extends CInfer {} - export function Record( - fields: Array<[string, Selection] | [TargetData]> - ): Selection.Record { - return {type: 'record', fields} - } - export interface Cursor extends CInfer {} - export function Cursor(cursor: CursorData): Selection.Cursor { - return {type: 'cursor', cursor} - } - export interface Expr extends CInfer {} - export function Expr(expr: ExprData, fromParent = false): Selection.Expr { - return {type: 'expr', expr, fromParent} - } - export interface Count extends CInfer {} - export function Count(): Selection.Count { - return {type: 'count'} - } - export const adt: CType = union( - types.Row, - types.Record, - types.Cursor, - types.Expr, - types.Count - ) - - export type Infer = Projection.Infer - export type Combine = Expand> & Infer> -} diff --git a/src/core/pages/SelectionVisitor.ts b/src/core/pages/SelectionVisitor.ts deleted file mode 100644 index f5010a75a..000000000 --- a/src/core/pages/SelectionVisitor.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {Selection} from './Selection.js' - -export interface SelectionVisitor { - visit?(selection: Selection): Produces - visitCursor?(selection: Selection.Cursor): Produces - visitRecord?(selection: Selection.Record): Produces - visitRow?(selection: Selection.Row): Produces - visitExpr?(selection: Selection.Expr): Produces -} diff --git a/src/core/pages/Serialize.ts b/src/core/pages/Serialize.ts index c588196af..d2fef1367 100644 --- a/src/core/pages/Serialize.ts +++ b/src/core/pages/Serialize.ts @@ -6,9 +6,7 @@ import {Type} from '../Type.js' import {Workspace} from '../Workspace.js' import {entries, values} from '../util/Objects.js' import {unreachable} from '../util/Types.js' -import {CursorData} from './Cursor.js' -import {ExprData} from './ExprData.js' -import {Selection} from './Selection.js' +import {CursorData, ExprData, Selection} from './ResolveData.js' import {TargetData} from './TargetData.js' export function seralizeLocation( diff --git a/src/core/pages/Snippet.ts b/src/core/pages/Snippet.ts index 0e7e5cfde..4d41155f1 100644 --- a/src/core/pages/Snippet.ts +++ b/src/core/pages/Snippet.ts @@ -1,5 +1,5 @@ import {Expr} from './Expr.js' -import {ExprData} from './ExprData.js' +import {ExprData} from './ResolveData.js' export function snippet( start = '', diff --git a/src/core/pages/Target.ts b/src/core/pages/Target.ts index 6a98ea574..d9c02dd36 100644 --- a/src/core/pages/Target.ts +++ b/src/core/pages/Target.ts @@ -1,17 +1,23 @@ import {Callable} from 'rado/util/Callable' import {createId} from '../Id.js' -import {createExprData} from './CreateExprData.js' import {Cursor} from './Cursor.js' -import {EV, Expr} from './Expr.js' -import {BinaryOp, ExprData} from './ExprData.js' +import {EV, Expr, createExprData} from './Expr.js' import {Fields} from './Fields.js' +import { + BinaryOp, + ExprData, + Selection, + targetData, + toSelection +} from './ResolveData.js' import {TargetData} from './TargetData.js' const {create, entries} = Object export declare class TargetI { get [Target.IsTarget](): true - get [Target.Data](): TargetData + get [targetData](): TargetData + [toSelection](): Selection.Row } export interface TargetI extends Callable { @@ -29,7 +35,6 @@ export namespace Target { } export const Target = class { - static readonly Data = Symbol.for('@alinea/Target.Data') static readonly IsTarget = Symbol.for('@alinea/Target.IsTarget') cache = create(null) @@ -90,8 +95,10 @@ export const Target = class { switch (prop) { case Target.IsTarget: return true - case Target.Data: + case targetData: return data + case toSelection: + return Selection.Row(data) } } }) diff --git a/src/core/pages/Tree.ts b/src/core/pages/Tree.ts deleted file mode 100644 index 14cf76753..000000000 --- a/src/core/pages/Tree.ts +++ /dev/null @@ -1,78 +0,0 @@ -import {Entry} from '../Entry.js' -import {Cursor, CursorData, SourceType} from './Cursor.js' -import {Selection} from './Selection.js' -import {Target, TargetI} from './Target.js' - -type Narrow = Cursor.Find | TargetI -type Output = [Narrow] extends [T] ? Entry : Selection.Infer - -export class Tree { - constructor(/*protected sourceId: string*/) { - this.children = this.children.bind(this) - this.parents = this.parents.bind(this) - } - - protected narrowData(narrow?: any): Partial { - return ( - narrow && - (Cursor.isCursor(narrow) - ? narrow[Cursor.Data] - : {target: narrow[Target.Data]}) - ) - } - - protected find( - sourceType: SourceType, - narrow?: any, - depth?: number - ): Cursor.Find { - return new Cursor.Find({ - ...this.narrowData(narrow), - source: {type: sourceType, depth} - }) - } - - protected get(sourceType: SourceType, narrow?: any): Cursor.Get { - return new Cursor.Get({ - ...this.narrowData(narrow), - first: true, - source: {type: sourceType} - }) - } - - children(depth?: number): Cursor.Find> - children(narrow?: N, depth?: number): Cursor.Find> - children( - narrow?: N | number, - depth?: number - ): Cursor.Find> { - ;[narrow, depth] = - typeof narrow === 'number' ? [undefined, narrow] : [narrow, depth || 1] - return this.find(SourceType.Children, narrow, depth) - } - parents(depth?: number): Cursor.Find> - parents(narrow?: N, depth?: number): Cursor.Find> - parents( - narrow?: N | number, - depth?: number - ): Cursor.Find> { - ;[narrow, depth] = - typeof narrow === 'number' ? [undefined, narrow] : [narrow, depth] - return this.find(SourceType.Parents, narrow, depth) - } - previous = (narrow?: N): Cursor.Get> => { - return this.get(SourceType.Previous, narrow) - } - next = (narrow?: N): Cursor.Get> => { - return this.get(SourceType.Next, narrow) - } - parent = (narrow?: N): Cursor.Get> => { - return this.get(SourceType.Parent, narrow) - } - siblings = (narrow?: N): Cursor.Find> => { - return this.find(SourceType.Siblings, narrow) - } - translations = (includeSelf = false): Cursor.Find => { - return this.find(SourceType.Translations) - } -} diff --git a/src/core/pages/index.ts b/src/core/pages/index.ts index ba2cbb42c..f5180f625 100644 --- a/src/core/pages/index.ts +++ b/src/core/pages/index.ts @@ -1,13 +1,9 @@ export * from '../Page.js' -export * from './CreateExprData.js' export * from './CreateSelection.js' export * from './Cursor.js' export * from './Expr.js' -export * from './ExprData.js' export * from './Fields.js' export * from './Projection.js' -export * from './Selection.js' +export * from './ResolveData.js' export * from './Snippet.js' export * from './Target.js' -export * from './TargetData.js' -export * from './Tree.js' diff --git a/src/core/shape/ListShape.test.ts b/src/core/shape/ListShape.test.ts index 64caec83e..b7737d59b 100644 --- a/src/core/shape/ListShape.test.ts +++ b/src/core/shape/ListShape.test.ts @@ -1,4 +1,4 @@ -import {ListShape} from 'alinea/core' +import {ListShape} from 'alinea/core/shape/ListShape' import {RecordShape} from 'alinea/core/shape/RecordShape' import {ScalarShape} from 'alinea/core/shape/ScalarShape' import * as Y from 'alinea/yjs' diff --git a/src/core/shape/RichTextShape.test.ts b/src/core/shape/RichTextShape.test.ts index b77f22d23..04dba3a5d 100644 --- a/src/core/shape/RichTextShape.test.ts +++ b/src/core/shape/RichTextShape.test.ts @@ -1,5 +1,5 @@ -import {RichTextShape} from 'alinea/core' import {RecordShape} from 'alinea/core/shape/RecordShape' +import {RichTextShape} from 'alinea/core/shape/RichTextShape' import {ScalarShape} from 'alinea/core/shape/ScalarShape' import * as Y from 'alinea/yjs' import {test} from 'uvu' diff --git a/src/core/EntryFilenames.ts b/src/core/util/EntryFilenames.ts similarity index 91% rename from src/core/EntryFilenames.ts rename to src/core/util/EntryFilenames.ts index 62adec5ed..3a6afed52 100644 --- a/src/core/EntryFilenames.ts +++ b/src/core/util/EntryFilenames.ts @@ -1,10 +1,9 @@ -import {JsonLoader} from 'alinea/backend' -import {Config} from './Config.js' -import {ALT_STATUS, EntryPhase, EntryRow} from './EntryRow.js' -import {EntryUrlMeta, Type} from './Type.js' -import {Workspace} from './Workspace.js' -import {values} from './util/Objects.js' -import {join} from './util/Paths.js' +import {Config} from '../Config.js' +import {ALT_STATUS, EntryPhase, EntryRow} from '../EntryRow.js' +import {EntryUrlMeta, Type} from '../Type.js' +import {Workspace} from '../Workspace.js' +import {values} from './Objects.js' +import {join} from './Paths.js' export function workspaceMediaDir(config: Config, workspace: string): string { return Workspace.data(config.workspaces[workspace])?.mediaDir ?? '' @@ -71,7 +70,7 @@ export function entryFilepath( const location = ( entryChildrenDir(config, entry, parentPaths) + phaseSegment + - JsonLoader.extension + '.json' ).toLowerCase() return location } diff --git a/src/core/util/EntryRows.ts b/src/core/util/EntryRows.ts index fcefa8eaf..3b9f5297d 100644 --- a/src/core/util/EntryRows.ts +++ b/src/core/util/EntryRows.ts @@ -1,11 +1,11 @@ import {JsonLoader} from 'alinea/backend/loader/JsonLoader' import {Config} from '../Config.js' -import {entryFilepath, entryInfo, entryUrl} from '../EntryFilenames.js' import {createRecord} from '../EntryRecord.js' import {EntryPhase, EntryRow} from '../EntryRow.js' import {Root} from '../Root.js' import {EntryUrlMeta, Type} from '../Type.js' import {createFileHash, createRowHash} from './ContentHash.js' +import {entryFilepath, entryInfo, entryUrl} from './EntryFilenames.js' import * as paths from './Paths.js' export async function createEntryRow( diff --git a/src/dashboard/App.tsx b/src/dashboard/App.tsx index 60c2dcc21..588bb76c0 100644 --- a/src/dashboard/App.tsx +++ b/src/dashboard/App.tsx @@ -1,4 +1,6 @@ -import {Config, Connection, Root, renderLabel} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Connection} from 'alinea/core/Connection' +import {Root} from 'alinea/core/Root' import {Icon, Loader, px} from 'alinea/ui' import {Statusbar} from 'alinea/ui/Statusbar' import {FavIcon} from 'alinea/ui/branding/FavIcon' @@ -115,7 +117,7 @@ function AppAuthenticated() { key={key} selected={isEntry && isSelected} href={link} - aria-label={renderLabel(label)} + aria-label={label} > diff --git a/src/dashboard/DashboardProvider.tsx b/src/dashboard/DashboardProvider.tsx index f0d9efef2..cdc7ff804 100644 --- a/src/dashboard/DashboardProvider.tsx +++ b/src/dashboard/DashboardProvider.tsx @@ -1,4 +1,5 @@ -import {Config, Connection} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Connection} from 'alinea/core/Connection' import {useAtomValue} from 'jotai' import {PropsWithChildren} from 'react' import {QueryClient, QueryClientProvider} from 'react-query' diff --git a/src/dashboard/Routes.tsx b/src/dashboard/Routes.tsx index 036625d73..d26e3671f 100644 --- a/src/dashboard/Routes.tsx +++ b/src/dashboard/Routes.tsx @@ -1,4 +1,4 @@ -import {Entry} from 'alinea/core' +import {Entry} from 'alinea/core/Entry' import {EntryLocation} from 'alinea/dashboard/DashboardNav' import {graphAtom} from 'alinea/dashboard/atoms/DbAtoms' import {locationAtom, useNavigate} from 'alinea/dashboard/atoms/LocationAtoms' diff --git a/src/dashboard/atoms/DashboardAtoms.ts b/src/dashboard/atoms/DashboardAtoms.ts index 8c02ab981..c3eeab18c 100644 --- a/src/dashboard/atoms/DashboardAtoms.ts +++ b/src/dashboard/atoms/DashboardAtoms.ts @@ -1,4 +1,6 @@ -import {Connection, Session, User, localUser} from 'alinea/core' +import {Connection} from 'alinea/core/Connection' +import {Session} from 'alinea/core/Session' +import {User, localUser} from 'alinea/core/User' import {atom, useAtomValue, useSetAtom} from 'jotai' import {useHydrateAtoms} from 'jotai/utils' import {useEffect} from 'react' diff --git a/src/dashboard/atoms/DbAtoms.ts b/src/dashboard/atoms/DbAtoms.ts index 58bd6d9c8..10c70b08a 100644 --- a/src/dashboard/atoms/DbAtoms.ts +++ b/src/dashboard/atoms/DbAtoms.ts @@ -1,13 +1,14 @@ import {Database} from 'alinea/backend' import {EntryResolver} from 'alinea/backend/resolver/EntryResolver' -import {Config, Entry} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Entry} from 'alinea/core/Entry' +import {Graph} from 'alinea/core/Graph' +import {Mutation, MutationType} from 'alinea/core/Mutation' import { applySuffix, entryFileName, pathSuffix -} from 'alinea/core/EntryFilenames' -import {Graph} from 'alinea/core/Graph' -import {Mutation, MutationType} from 'alinea/core/Mutation' +} from 'alinea/core/util/EntryFilenames' import { createEntryRow, entryParentPaths, diff --git a/src/dashboard/atoms/Edits.ts b/src/dashboard/atoms/Edits.ts index 1c4e16096..42ba2694d 100644 --- a/src/dashboard/atoms/Edits.ts +++ b/src/dashboard/atoms/Edits.ts @@ -1,4 +1,5 @@ -import {ROOT_KEY, Type} from 'alinea/core' +import {ROOT_KEY} from 'alinea/core/Doc' +import {Type} from 'alinea/core/Type' import {atom} from 'jotai' import {atomFamily} from 'jotai/utils' import * as Y from 'yjs' diff --git a/src/dashboard/atoms/EntryAtoms.ts b/src/dashboard/atoms/EntryAtoms.ts index 0043aa549..fd31d4c52 100644 --- a/src/dashboard/atoms/EntryAtoms.ts +++ b/src/dashboard/atoms/EntryAtoms.ts @@ -3,12 +3,13 @@ import { DropTarget, ItemInstance } from '@headless-tree/core' -import {EntryPhase, Type} from 'alinea/core' import {Entry} from 'alinea/core/Entry' -import {entryFileName} from 'alinea/core/EntryFilenames' +import {EntryPhase} from 'alinea/core/EntryRow' import {GraphRealm} from 'alinea/core/Graph' import {Mutation, MutationType} from 'alinea/core/Mutation' +import {Type} from 'alinea/core/Type' import {Projection} from 'alinea/core/pages/Projection' +import {entryFileName} from 'alinea/core/util/EntryFilenames' import {generateKeyBetween} from 'alinea/core/util/FractionalIndexing' import {entries} from 'alinea/core/util/Objects' import DataLoader from 'dataloader' diff --git a/src/dashboard/atoms/EntryEditorAtoms.ts b/src/dashboard/atoms/EntryEditorAtoms.ts index 7e6d1bc89..05fea2fa3 100644 --- a/src/dashboard/atoms/EntryEditorAtoms.ts +++ b/src/dashboard/atoms/EntryEditorAtoms.ts @@ -1,29 +1,23 @@ import {Media} from 'alinea/backend' -import { - Config, - Connection, - EntryPhase, - EntryRow, - EntryUrlMeta, - Field, - ROOT_KEY, - Root, - Type, - createId, - createYDoc, - parseYDoc -} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Connection} from 'alinea/core/Connection' +import {ROOT_KEY, createYDoc, parseYDoc} from 'alinea/core/Doc' import {Entry} from 'alinea/core/Entry' +import {EntryPhase, EntryRow} from 'alinea/core/EntryRow' +import {Field} from 'alinea/core/Field' +import {Graph} from 'alinea/core/Graph' +import {createId} from 'alinea/core/Id' +import {Mutation, MutationType} from 'alinea/core/Mutation' +import {Root} from 'alinea/core/Root' +import {EntryUrlMeta, Type} from 'alinea/core/Type' +import type {MediaFile} from 'alinea/core/media/MediaTypes' +import {base64} from 'alinea/core/util/Encoding' import { entryFileName, entryFilepath, entryInfo, entryUrl -} from 'alinea/core/EntryFilenames' -import {Graph} from 'alinea/core/Graph' -import {Mutation, MutationType} from 'alinea/core/Mutation' -import {MediaFile} from 'alinea/core/media/MediaSchema' -import {base64} from 'alinea/core/util/Encoding' +} from 'alinea/core/util/EntryFilenames' import {createEntryRow} from 'alinea/core/util/EntryRows' import {entries, fromEntries, values} from 'alinea/core/util/Objects' import * as paths from 'alinea/core/util/Paths' diff --git a/src/dashboard/atoms/EntrySummaryAtoms.ts b/src/dashboard/atoms/EntrySummaryAtoms.ts index c5b03f62d..7c5757956 100644 --- a/src/dashboard/atoms/EntrySummaryAtoms.ts +++ b/src/dashboard/atoms/EntrySummaryAtoms.ts @@ -1,5 +1,5 @@ -import {View} from 'alinea/core' import {Entry} from 'alinea/core/Entry' +import {View} from 'alinea/core/View' import {Cursor} from 'alinea/core/pages/Cursor' import DataLoader from 'dataloader' import {atom} from 'jotai' diff --git a/src/dashboard/atoms/FormAtoms.tsx b/src/dashboard/atoms/FormAtoms.tsx index eeacacaa4..e9a739a5f 100644 --- a/src/dashboard/atoms/FormAtoms.tsx +++ b/src/dashboard/atoms/FormAtoms.tsx @@ -1,20 +1,19 @@ -import { - Field, - FieldGetter, - FieldOptions, - ROOT_KEY, - Section, - Type, - ValueTracker, - applyEntryData, - optionTrackerOf, - valueTrackerOf -} from 'alinea/core' +import type {FieldOptions} from 'alinea/core/Field' +import {Field} from 'alinea/core/Field' +import {Type} from 'alinea/core/Type' import {entries} from 'alinea/core/util/Objects' import {Atom, Getter, atom} from 'jotai' import {PropsWithChildren, createContext, useContext, useMemo} from 'react' import * as Y from 'yjs' +import {ROOT_KEY, applyEntryData} from 'alinea/core/Doc' +import {Section} from 'alinea/core/Section' +import { + FieldGetter, + ValueTracker, + optionTrackerOf, + valueTrackerOf +} from 'alinea/core/Tracker' import {unwrap} from 'jotai/utils' export interface FieldInfo< diff --git a/src/dashboard/atoms/NavigationAtoms.tsx b/src/dashboard/atoms/NavigationAtoms.tsx index faa981384..be5be49cd 100644 --- a/src/dashboard/atoms/NavigationAtoms.tsx +++ b/src/dashboard/atoms/NavigationAtoms.tsx @@ -1,4 +1,5 @@ -import {Root, Workspace} from 'alinea/core' +import {Root} from 'alinea/core/Root' +import {Workspace} from 'alinea/core/Workspace' import {keys} from 'alinea/core/util/Objects' import {atom, useAtom} from 'jotai' import {atomWithStorage} from 'jotai/utils' diff --git a/src/dashboard/dev/DevDashboard.tsx b/src/dashboard/dev/DevDashboard.tsx index 5bfd2c835..830b8ca0b 100644 --- a/src/dashboard/dev/DevDashboard.tsx +++ b/src/dashboard/dev/DevDashboard.tsx @@ -1,5 +1,5 @@ -import {Config} from 'alinea/core' import {Client} from 'alinea/core/Client' +import {Config} from 'alinea/core/Config' import {joinPaths} from 'alinea/core/util/Urls' import {useSetAtom} from 'jotai' import {useEffect, useMemo, useState} from 'react' diff --git a/src/dashboard/editor/InputForm.tsx b/src/dashboard/editor/InputForm.tsx index e642fe183..6ea5331f1 100644 --- a/src/dashboard/editor/InputForm.tsx +++ b/src/dashboard/editor/InputForm.tsx @@ -1,4 +1,6 @@ -import {Field, Section, Type} from 'alinea/core' +import {Field} from 'alinea/core/Field' +import {Section} from 'alinea/core/Section' +import {Type} from 'alinea/core/Type' import {entries} from 'alinea/core/util/Objects' import {useFieldOptions} from 'alinea/dashboard/editor/UseField' import {Lift} from 'alinea/ui/Lift' diff --git a/src/dashboard/hook/UseExplorer.ts b/src/dashboard/hook/UseExplorer.ts index d65f4ccdd..bddf2586f 100644 --- a/src/dashboard/hook/UseExplorer.ts +++ b/src/dashboard/hook/UseExplorer.ts @@ -1,4 +1,4 @@ -import {Reference} from 'alinea/core' +import {Reference} from 'alinea/core/Reference' import {createContext, useContext} from 'react' import {ExporerItemSelect} from '../view/explorer/Explorer.js' diff --git a/src/dashboard/hook/UseUploads.ts b/src/dashboard/hook/UseUploads.ts index 6cc9707f4..829e3f194 100644 --- a/src/dashboard/hook/UseUploads.ts +++ b/src/dashboard/hook/UseUploads.ts @@ -1,20 +1,16 @@ import {Media} from 'alinea/backend/Media' -import { - Connection, - Entry, - EntryPhase, - EntryRow, - HttpError, - Workspace, - slugify -} from 'alinea/core' -import {entryFileName, entryFilepath} from 'alinea/core/EntryFilenames' +import {Connection} from 'alinea/core/Connection' +import {Entry} from 'alinea/core/Entry' +import {EntryPhase, EntryRow} from 'alinea/core/EntryRow' +import {HttpError} from 'alinea/core/HttpError' import {createId} from 'alinea/core/Id' import {Mutation, MutationType} from 'alinea/core/Mutation' +import {Workspace} from 'alinea/core/Workspace' import {createPreview} from 'alinea/core/media/CreatePreview' import {isImage} from 'alinea/core/media/IsImage' -import {MediaFile} from 'alinea/core/media/MediaSchema' +import type {MediaFile} from 'alinea/core/media/MediaTypes' import {createFileHash} from 'alinea/core/util/ContentHash' +import {entryFileName, entryFilepath} from 'alinea/core/util/EntryFilenames' import {createEntryRow} from 'alinea/core/util/EntryRows' import {generateKeyBetween} from 'alinea/core/util/FractionalIndexing' import { @@ -24,6 +20,7 @@ import { join, normalize } from 'alinea/core/util/Paths' +import {slugify} from 'alinea/core/util/Slugs' import {atom, useAtom, useSetAtom} from 'jotai' import pLimit from 'p-limit' import {useEffect} from 'react' diff --git a/src/dashboard/pages/ContentView.tsx b/src/dashboard/pages/ContentView.tsx index 2868bbc61..291f2fef9 100644 --- a/src/dashboard/pages/ContentView.tsx +++ b/src/dashboard/pages/ContentView.tsx @@ -1,6 +1,7 @@ import {HStack, Icon, Loader, fromModule} from 'alinea/ui' import IcRoundAddCircle from 'alinea/ui/icons/IcRoundAddCircle' import {EntryEditor} from '../atoms/EntryEditorAtoms.js' +import {useConfig} from '../hook/UseConfig.js' import {useNav} from '../hook/UseNav.js' import {useRoot} from '../hook/UseRoot.js' import {useWorkspace} from '../hook/UseWorkspace.js' @@ -28,6 +29,8 @@ export function ContentView({editor}: ContentViewProps) { const RootView = root?.view ?? RootOverview const nav = useNav() const navigate = useNavigate() + const {schema} = useConfig() + const type = editor && schema[editor.activeVersion.type] return ( <> @@ -60,7 +63,11 @@ export function ContentView({editor}: ContentViewProps) { {search === '?new' && } }> - {editor ? : } + {type && editor ? ( + + ) : ( + + )} ) diff --git a/src/dashboard/pages/DraftsOverview.tsx b/src/dashboard/pages/DraftsOverview.tsx index f2ace3f4c..3ddb83893 100644 --- a/src/dashboard/pages/DraftsOverview.tsx +++ b/src/dashboard/pages/DraftsOverview.tsx @@ -1,4 +1,4 @@ -import {Entry} from 'alinea/core' +import {Entry} from 'alinea/core/Entry' import {Button, HStack, Stack, Typo, VStack, fromModule, px} from 'alinea/ui' import {IcRoundArrowForward} from 'alinea/ui/icons/IcRoundArrowForward' import {useAtomValue} from 'jotai' diff --git a/src/dashboard/view/EntryEdit.tsx b/src/dashboard/view/EntryEdit.tsx index ce22d85f2..f8734feb7 100644 --- a/src/dashboard/view/EntryEdit.tsx +++ b/src/dashboard/view/EntryEdit.tsx @@ -1,4 +1,6 @@ -import {EntryPhase, Section, Type} from 'alinea/core' +import {EntryPhase} from 'alinea/core/EntryRow' +import {Section} from 'alinea/core/Section' +import {Type} from 'alinea/core/Type' import {FormProvider} from 'alinea/dashboard' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {Modal} from 'alinea/dashboard/view/Modal' diff --git a/src/dashboard/view/EntryTree.tsx b/src/dashboard/view/EntryTree.tsx index f37137bfc..4afabd125 100644 --- a/src/dashboard/view/EntryTree.tsx +++ b/src/dashboard/view/EntryTree.tsx @@ -5,7 +5,8 @@ import { selectionFeature } from '@headless-tree/core' import {useTree} from '@headless-tree/react' -import {EntryPhase, Type} from 'alinea/core' +import {EntryPhase} from 'alinea/core/EntryRow' +import {Type} from 'alinea/core/Type' import {Icon, fromModule, px} from 'alinea/ui' import {IcOutlineDescription} from 'alinea/ui/icons/IcOutlineDescription' import {IcRoundArchive} from 'alinea/ui/icons/IcRoundArchive' diff --git a/src/dashboard/view/MediaExplorer.tsx b/src/dashboard/view/MediaExplorer.tsx index 0b4dc3cf9..aa1a4805c 100644 --- a/src/dashboard/view/MediaExplorer.tsx +++ b/src/dashboard/view/MediaExplorer.tsx @@ -4,8 +4,9 @@ import {useMemo} from 'react' import {useQuery} from 'react-query' //import {EntryProperty} from '../draft/EntryProperty.js' //import {useCurrentDraft} from '../hook/UseCurrentDraft.js' -import {Entry, RootData} from 'alinea/core' -import {workspaceMediaDir} from 'alinea/core/EntryFilenames' +import {Entry} from 'alinea/core/Entry' +import {RootData} from 'alinea/core/Root' +import {workspaceMediaDir} from 'alinea/core/util/EntryFilenames' import {IcRoundArrowBack} from 'alinea/ui/icons/IcRoundArrowBack' import {useAtomValue} from 'jotai' import {graphAtom} from '../atoms/DbAtoms.js' diff --git a/src/dashboard/view/RootOverview.tsx b/src/dashboard/view/RootOverview.tsx index 36c25d055..61e1b8e15 100644 --- a/src/dashboard/view/RootOverview.tsx +++ b/src/dashboard/view/RootOverview.tsx @@ -1,4 +1,3 @@ -import {renderLabel} from 'alinea/core' import {RootData} from 'alinea/core/Root' import {Icon, TextLabel, Typo, fromModule} from 'alinea/ui' import {Main} from 'alinea/ui/Main' @@ -16,7 +15,7 @@ export function RootOverview({root}: RootOverviewProps) { return ( <> - {renderLabel(root.label)} + {root.label}
diff --git a/src/dashboard/view/SearchBox.tsx b/src/dashboard/view/SearchBox.tsx index fba7f8e13..071d770cd 100644 --- a/src/dashboard/view/SearchBox.tsx +++ b/src/dashboard/view/SearchBox.tsx @@ -1,4 +1,4 @@ -import {Entry} from 'alinea/core' +import {Entry} from 'alinea/core/Entry' import {useLocation, useNavigate} from 'alinea/dashboard/util/HashRouter' import {HStack, Stack, fromModule} from 'alinea/ui' import {IcOutlineGridView} from 'alinea/ui/icons/IcOutlineGridView' diff --git a/src/dashboard/view/Sidebar.tsx b/src/dashboard/view/Sidebar.tsx index a0cd4fc63..a3bf9da96 100644 --- a/src/dashboard/view/Sidebar.tsx +++ b/src/dashboard/view/Sidebar.tsx @@ -1,5 +1,6 @@ import {useWindowWidth} from '@react-hook/window-size' -import {Root, Workspace} from 'alinea/core' +import {Root} from 'alinea/core/Root' +import {Workspace} from 'alinea/core/Workspace' import {entries} from 'alinea/core/util/Objects' import {link, useNavigate} from 'alinea/dashboard/util/HashRouter' import {HStack, Icon, Stack, fromModule} from 'alinea/ui' diff --git a/src/dashboard/view/Toolbar.tsx b/src/dashboard/view/Toolbar.tsx index 7e133fbb4..15daef003 100644 --- a/src/dashboard/view/Toolbar.tsx +++ b/src/dashboard/view/Toolbar.tsx @@ -1,6 +1,8 @@ import {Switch} from '@headlessui/react' -import {Root as AlineaRoot, Config, Workspace} from 'alinea/core' +import {Config} from 'alinea/core/Config' import {Label} from 'alinea/core/Label' +import {Root as AlineaRoot} from 'alinea/core/Root' +import {Workspace} from 'alinea/core/Workspace' import {entries, fromEntries} from 'alinea/core/util/Objects' import {link, useNavigate} from 'alinea/dashboard/util/HashRouter' import {select} from 'alinea/field/select' diff --git a/src/dashboard/view/WorkspaceLabel.tsx b/src/dashboard/view/WorkspaceLabel.tsx index 4ab22b3b9..9accc01ee 100644 --- a/src/dashboard/view/WorkspaceLabel.tsx +++ b/src/dashboard/view/WorkspaceLabel.tsx @@ -1,4 +1,3 @@ -import {Label} from 'alinea/core' import {HStack, Icon, TextLabel, fromModule} from 'alinea/ui' import {LogoShape} from 'alinea/ui/branding/LogoShape' import {RiFlashlightFill} from 'alinea/ui/icons/RiFlashlightFill' @@ -10,7 +9,7 @@ const styles = fromModule(css) export type WorkspaceLabelProps = { color?: string - label: Label + label: string icon?: ComponentType } diff --git a/src/dashboard/view/diff/EntryDiff.tsx b/src/dashboard/view/diff/EntryDiff.tsx index 1ceaaabf1..6e4185887 100644 --- a/src/dashboard/view/diff/EntryDiff.tsx +++ b/src/dashboard/view/diff/EntryDiff.tsx @@ -1,4 +1,5 @@ -import {EntryRow, Type} from 'alinea/core' +import {EntryRow} from 'alinea/core/EntryRow' +import {Type} from 'alinea/core/Type' import {Chip, TextLabel, fromModule} from 'alinea/ui' import {useConfig} from '../../hook/UseConfig.js' import {diffRecord} from './DiffUtils.js' diff --git a/src/dashboard/view/diff/FieldDiff.tsx b/src/dashboard/view/diff/FieldDiff.tsx index 54faf892d..8d1c74b7a 100644 --- a/src/dashboard/view/diff/FieldDiff.tsx +++ b/src/dashboard/view/diff/FieldDiff.tsx @@ -1,6 +1,7 @@ -import {RichTextShape, Shape} from 'alinea/core' +import {Shape} from 'alinea/core/Shape' import {ListShape} from 'alinea/core/shape/ListShape' import {RecordShape} from 'alinea/core/shape/RecordShape' +import {RichTextShape} from 'alinea/core/shape/RichTextShape' import {ScalarShape} from 'alinea/core/shape/ScalarShape' import {UnionShape} from 'alinea/core/shape/UnionShape' import {diffRecord} from './DiffUtils.js' diff --git a/src/dashboard/view/diff/FieldsDiff.tsx b/src/dashboard/view/diff/FieldsDiff.tsx index e5b4151c6..8c7e64ce1 100644 --- a/src/dashboard/view/diff/FieldsDiff.tsx +++ b/src/dashboard/view/diff/FieldsDiff.tsx @@ -1,4 +1,4 @@ -import {Shape} from 'alinea/core' +import {Shape} from 'alinea/core/Shape' import {InputLabel} from 'alinea/dashboard/view/InputLabel' import {VStack} from 'alinea/ui' import {Lift} from 'alinea/ui/Lift' diff --git a/src/dashboard/view/diff/RichTextDiff.tsx b/src/dashboard/view/diff/RichTextDiff.tsx index e70ad4b38..0a88d7a01 100644 --- a/src/dashboard/view/diff/RichTextDiff.tsx +++ b/src/dashboard/view/diff/RichTextDiff.tsx @@ -1,5 +1,6 @@ -import {RichTextShape, TextDoc} from 'alinea/core' +import type {TextDoc} from 'alinea/core/TextDoc' import {RecordShape} from 'alinea/core/shape/RecordShape' +import {RichTextShape} from 'alinea/core/shape/RichTextShape' import {Sink} from 'alinea/ui/Sink' import {ReactNode, useMemo} from 'react' import {ChangeBox} from './ChangeBox.js' diff --git a/src/dashboard/view/entry/EntryHeader.tsx b/src/dashboard/view/entry/EntryHeader.tsx index c73d208e2..fb3a4bbf6 100644 --- a/src/dashboard/view/entry/EntryHeader.tsx +++ b/src/dashboard/view/entry/EntryHeader.tsx @@ -1,5 +1,5 @@ -import {EntryPhase} from 'alinea/core' -import {entryFile, workspaceMediaDir} from 'alinea/core/EntryFilenames' +import {EntryPhase} from 'alinea/core/EntryRow' +import {entryFile, workspaceMediaDir} from 'alinea/core/util/EntryFilenames' import {Button, HStack, Icon, Stack, fromModule, px} from 'alinea/ui' import {AppBar} from 'alinea/ui/AppBar' import {DropdownMenu} from 'alinea/ui/DropdownMenu' diff --git a/src/dashboard/view/entry/EntryPreview.tsx b/src/dashboard/view/entry/EntryPreview.tsx index 4a9d9c68a..8440b1c51 100644 --- a/src/dashboard/view/entry/EntryPreview.tsx +++ b/src/dashboard/view/entry/EntryPreview.tsx @@ -1,4 +1,6 @@ -import {Config, Entry, PreviewUpdate} from 'alinea/core' +import {Config} from 'alinea/core/Config' +import {Entry} from 'alinea/core/Entry' +import {PreviewUpdate} from 'alinea/core/Resolver' import {base64url} from 'alinea/core/util/Encoding' import {zlibSync} from 'fflate' import {useAtomValue} from 'jotai' diff --git a/src/dashboard/view/entry/EntrySummary.tsx b/src/dashboard/view/entry/EntrySummary.tsx index 43fe89870..8a9016c41 100644 --- a/src/dashboard/view/entry/EntrySummary.tsx +++ b/src/dashboard/view/entry/EntrySummary.tsx @@ -1,4 +1,6 @@ -import {Entry, Type, view} from 'alinea/core' +import {Entry} from 'alinea/core/Entry' +import {Type} from 'alinea/core/Type' +import {view} from 'alinea/core/View' import {Projection} from 'alinea/core/pages/Projection' import {Chip, HStack, TextLabel, Typo, VStack, fromModule, px} from 'alinea/ui' import {Ellipsis} from 'alinea/ui/Ellipsis' diff --git a/src/dashboard/view/entry/EntryTitle.tsx b/src/dashboard/view/entry/EntryTitle.tsx index b01d537fa..31e1869a4 100644 --- a/src/dashboard/view/entry/EntryTitle.tsx +++ b/src/dashboard/view/entry/EntryTitle.tsx @@ -1,5 +1,6 @@ -import {EntryPhase, Type} from 'alinea/core' +import {EntryPhase} from 'alinea/core/EntryRow' import {renderLabel} from 'alinea/core/Label' +import {Type} from 'alinea/core/Type' import {Chip, HStack, Loader, Stack, fromModule, px} from 'alinea/ui' import {IcRoundArrowBack} from 'alinea/ui/icons/IcRoundArrowBack' import {useAtom, useAtomValue} from 'jotai' diff --git a/src/dashboard/view/entry/NewEntry.tsx b/src/dashboard/view/entry/NewEntry.tsx index 291d649a8..de81261f7 100644 --- a/src/dashboard/view/entry/NewEntry.tsx +++ b/src/dashboard/view/entry/NewEntry.tsx @@ -1,24 +1,21 @@ -import { - Entry, - EntryPhase, - Type, - createId, - slugify, - track, - type -} from 'alinea/core' +import {Entry} from 'alinea/core/Entry' +import {EntryPhase} from 'alinea/core/EntryRow' +import {createId} from 'alinea/core/Id' +import {MutationType} from 'alinea/core/Mutation' +import {track} from 'alinea/core/Tracker' +import {Type, type} from 'alinea/core/Type' +import {Projection} from 'alinea/core/pages/Projection' import { entryChildrenDir, entryFileName, entryFilepath, entryUrl -} from 'alinea/core/EntryFilenames' -import {MutationType} from 'alinea/core/Mutation' -import {Projection} from 'alinea/core/pages/Projection' +} from 'alinea/core/util/EntryFilenames' import {createEntryRow} from 'alinea/core/util/EntryRows' import {generateKeyBetween} from 'alinea/core/util/FractionalIndexing' import {entries, fromEntries, keys} from 'alinea/core/util/Objects' import {dirname} from 'alinea/core/util/Paths' +import {slugify} from 'alinea/core/util/Slugs' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {useLocation, useNavigate} from 'alinea/dashboard/util/HashRouter' @@ -168,10 +165,12 @@ function NewEntryForm({parentId}: NewEntryProps) { const formType = useMemo( () => type({ - parent: parentField, - title: titleField, - type: typeField, - copyFrom: copyFromField + fields: { + parent: parentField, + title: titleField, + type: typeField, + copyFrom: copyFromField + } }), [] ) diff --git a/src/dashboard/view/explorer/Explorer.tsx b/src/dashboard/view/explorer/Explorer.tsx index b2c0c5b86..6ecb92853 100644 --- a/src/dashboard/view/explorer/Explorer.tsx +++ b/src/dashboard/view/explorer/Explorer.tsx @@ -1,5 +1,6 @@ import useSize from '@react-hook/size' -import {Reference, View} from 'alinea/core' +import {Reference} from 'alinea/core/Reference' +import {View} from 'alinea/core/View' import {Cursor} from 'alinea/core/pages/Cursor' import {Loader, fromModule} from 'alinea/ui' import {useAtomValue} from 'jotai' diff --git a/src/dashboard/view/explorer/ExplorerItem.tsx b/src/dashboard/view/explorer/ExplorerItem.tsx index 937da851f..cbfd7193c 100644 --- a/src/dashboard/view/explorer/ExplorerItem.tsx +++ b/src/dashboard/view/explorer/ExplorerItem.tsx @@ -1,4 +1,6 @@ -import {Schema, Type, View} from 'alinea/core' +import {Schema} from 'alinea/core/Schema' +import {Type} from 'alinea/core/Type' +import {View} from 'alinea/core/View' import {link} from 'alinea/dashboard/util/HashRouter' import {EntryReference} from 'alinea/picker/entry/EntryReference' import {Icon, fromModule} from 'alinea/ui' diff --git a/src/dashboard/view/explorer/ExplorerRow.tsx b/src/dashboard/view/explorer/ExplorerRow.tsx index 46bcbd428..bf2ec6d5d 100644 --- a/src/dashboard/view/explorer/ExplorerRow.tsx +++ b/src/dashboard/view/explorer/ExplorerRow.tsx @@ -1,4 +1,6 @@ -import {EntryRow, Schema, View} from 'alinea/core' +import {EntryRow} from 'alinea/core/EntryRow' +import {Schema} from 'alinea/core/Schema' +import {View} from 'alinea/core/View' import {Cursor} from 'alinea/core/pages/Cursor' import {fromModule} from 'alinea/ui' import {useAtomValue} from 'jotai' diff --git a/src/dashboard/view/media/FileEntry.tsx b/src/dashboard/view/media/FileEntry.tsx index 1f2a47cca..acad770e2 100644 --- a/src/dashboard/view/media/FileEntry.tsx +++ b/src/dashboard/view/media/FileEntry.tsx @@ -1,6 +1,6 @@ import {Media} from 'alinea/backend/Media' import {isImage} from 'alinea/core/media/IsImage' -import {MediaFile} from 'alinea/core/media/MediaSchema' +import {MediaFile} from 'alinea/core/media/MediaTypes' import {FormProvider, useField} from 'alinea/dashboard' import {Typo, fromModule} from 'alinea/ui' import {Lift} from 'alinea/ui/Lift' @@ -24,10 +24,10 @@ interface Pos { y?: number } -function ImageView({editor}: EntryEditProps) { +function ImageView({type, editor}: EntryEditProps & {type: typeof MediaFile}) { const image: Media.Image = editor.activeVersion as any const {value: focus = {x: 0.5, y: 0.5}, mutator: setFocus} = useField( - MediaFile.focus + type.focus ) const [hover, setHover] = useState({}) const {x: focusX = focus.x, y: focusY = focus.y} = hover @@ -78,7 +78,7 @@ function ImageView({editor}: EntryEditProps) {
- + {image.data.extension} {prettyBytes(image.data.size)} @@ -126,11 +126,11 @@ export function IcTwotonePinDrop() { ) } -function FileView({editor}: EntryEditProps) { +function FileView({type, editor}: EntryEditProps & {type: typeof MediaFile}) { const file: Media.File = editor.activeVersion as any return ( - + {file.data.extension} {prettyBytes(file.data.size)} @@ -145,7 +145,7 @@ function FileView({editor}: EntryEditProps) { ) } -export function FileEntry(props: EntryEditProps) { +export function FileEntry(props: EntryEditProps & {type: typeof MediaFile}) { const nav = useNav() const {editor} = props const form = useAtomValue(editor.form) diff --git a/src/dashboard/view/media/FileSummary.tsx b/src/dashboard/view/media/FileSummary.tsx index 5e95af2fb..4ed7b8894 100644 --- a/src/dashboard/view/media/FileSummary.tsx +++ b/src/dashboard/view/media/FileSummary.tsx @@ -1,5 +1,4 @@ -import {Entry, renderLabel, view} from 'alinea/core' -import {MediaFile} from 'alinea/core/media/MediaSchema' +import type {fileSummarySelect} from 'alinea/core/media/MediaTypes.browser' import {Projection} from 'alinea/core/pages/Projection' import {Chip, HStack, TextLabel, Typo, VStack, fromModule, px} from 'alinea/ui' import {Ellipsis} from 'alinea/ui/Ellipsis' @@ -12,120 +11,86 @@ import css from './FileSummary.module.scss' const styles = fromModule(css) -function fileSummarySelect() { - return { - entryId: Entry.entryId, - i18nId: Entry.i18nId, - type: Entry.type, - workspace: Entry.workspace, - root: Entry.root, - title: Entry.title, - extension: MediaFile.extension, - size: MediaFile.size, - preview: MediaFile.preview, - thumbHash: MediaFile.thumbHash, - averageColor: MediaFile.averageColor, - focus: MediaFile.focus, - width: MediaFile.width, - height: MediaFile.height, - parents({parents}) { - return parents(Entry).select({ - entryId: Entry.entryId, - i18nId: Entry.i18nId, - title: Entry.title - }) - } - } satisfies Projection -} - type SummaryProps = Projection.Infer> -export const FileSummaryRow = view( - fileSummarySelect, - function FileSummaryRow(file: SummaryProps) { - return ( - -
- {file.preview ? ( - - ) : ( -
- -
- )} -
- - {file.parents.length > 0 && ( - - - - {file.parents - .map(({entryId, title}) => ( - {title} - )) - .reduce((prev, curr) => [ - prev, - , - curr - ])} - - - - )} +export function FileSummaryRow(file: SummaryProps) { + return ( + +
+ {file.preview ? ( + + ) : ( +
+ +
+ )} +
+ + {file.parents.length > 0 && ( - + + + {file.parents + .map(({entryId, title}) => ( + {title} + )) + .reduce((prev, curr) => [ + prev, + , + curr + ])} + + - - {file.extension && ( - - {file.extension.slice(1).toUpperCase()} - )} -
- ) - } -) + + + +
+ {file.extension && ( + + {file.extension.slice(1).toUpperCase()} + + )} +
+ ) +} -export const FileSummaryThumb = view( - fileSummarySelect, - function FileSummaryThumb(file: SummaryProps) { - return ( -
-
- {file.preview ? ( - - ) : ( -
- -
+export function FileSummaryThumb(file: SummaryProps) { + return ( +
+
+ {file.preview ? ( + + ) : ( +
+ +
+ )} +
+
+

{file.title}

+

+ {file.extension?.slice(1).toUpperCase()} + {file.width && file.height && ` - ${file.width}x${file.height}`} + {file.size && ( + {prettyBytes(file.size)} )} -

-
-

- {renderLabel(file.title)} -

-

- {file.extension?.slice(1).toUpperCase()} - {file.width && file.height && ` - ${file.width}x${file.height}`} - {file.size && ( - {prettyBytes(file.size)} - )} -

-
+

- ) - } -) +
+ ) +} diff --git a/src/dashboard/view/media/MediaThumbnail.tsx b/src/dashboard/view/media/MediaThumbnail.tsx index 36beac953..f1b3a2382 100644 --- a/src/dashboard/view/media/MediaThumbnail.tsx +++ b/src/dashboard/view/media/MediaThumbnail.tsx @@ -1,4 +1,3 @@ -import {renderLabel} from 'alinea/core' import {link} from 'alinea/dashboard/util/HashRouter' import {fromModule, px} from 'alinea/ui' import {useContrastColor} from 'alinea/ui/hook/UseContrastColor' @@ -39,9 +38,7 @@ export function MediaThumbnail({file}: MediaThumbnailProps) { )}
- - {renderLabel(file.title)} - + {file.title}
{extension}
diff --git a/src/dashboard/view/sidebar/SidebarSettings.tsx b/src/dashboard/view/sidebar/SidebarSettings.tsx index 7dc913426..dd7268b1f 100644 --- a/src/dashboard/view/sidebar/SidebarSettings.tsx +++ b/src/dashboard/view/sidebar/SidebarSettings.tsx @@ -1,5 +1,5 @@ import {Switch} from '@headlessui/react' -import {Workspace} from 'alinea/core' +import {Workspace} from 'alinea/core/Workspace' import {entries, fromEntries} from 'alinea/core/util/Objects' import {select} from 'alinea/field' import {HStack, Icon, VStack, fromModule, px} from 'alinea/ui' diff --git a/src/field/check/CheckField.browser.tsx b/src/field/check/CheckField.browser.tsx index 7187ad04e..1ba8ff65b 100644 --- a/src/field/check/CheckField.browser.tsx +++ b/src/field/check/CheckField.browser.tsx @@ -1,4 +1,4 @@ -import {Field} from 'alinea/core' +import {Field} from 'alinea/core/Field' import {useField} from 'alinea/dashboard/editor/UseField' import {InputLabel} from 'alinea/dashboard/view/InputLabel' import {HStack, Icon, TextLabel, fromModule} from 'alinea/ui' diff --git a/src/field/check/CheckField.stories.tsx b/src/field/check/CheckField.stories.tsx index 0aa6018af..3a1585839 100644 --- a/src/field/check/CheckField.stories.tsx +++ b/src/field/check/CheckField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {check} from 'alinea/field/check' diff --git a/src/field/check/CheckField.tsx b/src/field/check/CheckField.tsx index 6407394f5..fcf113de4 100644 --- a/src/field/check/CheckField.tsx +++ b/src/field/check/CheckField.tsx @@ -1,18 +1,17 @@ -import {FieldOptions, Hint, Label, WithoutLabel} from 'alinea/core' +import {FieldOptions, WithoutLabel} from 'alinea/core/Field' +import {Hint} from 'alinea/core/Hint' import {ScalarField} from 'alinea/core/field/ScalarField' /** Optional settings to configure a text field */ export interface CheckOptions extends FieldOptions { /** Description displayed next to the checkbox */ - description?: Label + description?: string /** Width of the field in the dashboard UI (0-1) */ width?: number /** Add instructional text to a field */ help?: string /** Display a minimal version */ inline?: boolean - /** A default value */ - initialValue?: boolean /** Focus this input automatically */ autoFocus?: boolean } diff --git a/src/field/code/CodeField.stories.tsx b/src/field/code/CodeField.stories.tsx index 6a6564b25..bd64187ec 100644 --- a/src/field/code/CodeField.stories.tsx +++ b/src/field/code/CodeField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {code} from 'alinea/field/code' diff --git a/src/field/date/DateField.stories.tsx b/src/field/date/DateField.stories.tsx index 7999852aa..89d6bd59a 100644 --- a/src/field/date/DateField.stories.tsx +++ b/src/field/date/DateField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {date} from 'alinea/field/date' diff --git a/src/field/json/JsonField.stories.tsx b/src/field/json/JsonField.stories.tsx index 69bd11267..8e3f8c676 100644 --- a/src/field/json/JsonField.stories.tsx +++ b/src/field/json/JsonField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {json} from 'alinea/field/json' @@ -6,9 +6,11 @@ import {VStack} from 'alinea/ui' import {UIStory} from 'alinea/ui/UIStory' const fields = type('Field', { - json: json('Json'), - focused: json('Json (autofocus)', {autoFocus: true}), - readOnly: json('Json (read-only)', {readOnly: true}) + fields: { + json: json('Json'), + focused: json('Json (autofocus)', {autoFocus: true}), + readOnly: json('Json (read-only)', {readOnly: true}) + } }) export function JsonField() { diff --git a/src/field/link/LinkConstructors.ts b/src/field/link/LinkConstructors.ts index 8ffb860e7..0691ec638 100644 --- a/src/field/link/LinkConstructors.ts +++ b/src/field/link/LinkConstructors.ts @@ -1,11 +1,11 @@ -import {ListRow} from 'alinea/core' import {Entry} from 'alinea/core/Entry' -import {WithoutLabel} from 'alinea/core/Field' +import type {WithoutLabel} from 'alinea/core/Field' import {Hint} from 'alinea/core/Hint' import {Label} from 'alinea/core/Label' import {Type} from 'alinea/core/Type' import {imageExtensions} from 'alinea/core/media/IsImage' -import {MediaFile} from 'alinea/core/media/MediaSchema' +import {MediaFile} from 'alinea/core/media/MediaTypes' +import type {ListRow} from 'alinea/core/shape/ListShape' import { LinkFieldOptions, createLink, diff --git a/src/field/link/LinkField.browser.tsx b/src/field/link/LinkField.browser.tsx index 5bf5c2ebb..99f2c17bf 100644 --- a/src/field/link/LinkField.browser.tsx +++ b/src/field/link/LinkField.browser.tsx @@ -21,7 +21,11 @@ import { verticalListSortingStrategy } from '@dnd-kit/sortable' import {CSS, FirstArgument} from '@dnd-kit/utilities' -import {Field, ListRow, Picker, Reference, Type} from 'alinea/core' +import {Field} from 'alinea/core/Field' +import {Picker} from 'alinea/core/Picker' +import {Reference} from 'alinea/core/Reference' +import {Type} from 'alinea/core/Type' +import {ListRow} from 'alinea/core/shape/ListShape' import {entries} from 'alinea/core/util/Objects' import {FormRow} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' diff --git a/src/field/link/LinkField.tsx b/src/field/link/LinkField.tsx index 386267aa7..8e31b6b0f 100644 --- a/src/field/link/LinkField.tsx +++ b/src/field/link/LinkField.tsx @@ -1,7 +1,10 @@ -import type {ListRow, Picker, WithoutLabel} from 'alinea/core' -import {FieldOptions, Hint, Reference} from 'alinea/core' +import type {FieldOptions, WithoutLabel} from 'alinea/core/Field' +import {Hint} from 'alinea/core/Hint' +import type {Picker} from 'alinea/core/Picker' +import {Reference} from 'alinea/core/Reference' import {ListField} from 'alinea/core/field/ListField' import {UnionField} from 'alinea/core/field/UnionField' +import type {ListRow} from 'alinea/core/shape/ListShape' import {UnionRow} from 'alinea/core/shape/UnionShape' import {entries, fromEntries} from 'alinea/core/util/Objects' diff --git a/src/field/link/LinkInput.stories.tsx b/src/field/link/LinkInput.stories.tsx index cfe7ed5a1..6aa0a3137 100644 --- a/src/field/link/LinkInput.stories.tsx +++ b/src/field/link/LinkInput.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {link} from 'alinea/field/link/LinkConstructors' diff --git a/src/field/list/ListField.browser.tsx b/src/field/list/ListField.browser.tsx index e2f15caed..a27059a55 100644 --- a/src/field/list/ListField.browser.tsx +++ b/src/field/list/ListField.browser.tsx @@ -21,8 +21,11 @@ import { verticalListSortingStrategy } from '@dnd-kit/sortable' import {CSS, FirstArgument} from '@dnd-kit/utilities' -import {Field, Infer, Schema, Type} from 'alinea/core' +import {Field} from 'alinea/core/Field' import {ListField} from 'alinea/core/field/ListField' +import type {Infer} from 'alinea/core/Infer' +import {Schema} from 'alinea/core/Schema' +import {Type} from 'alinea/core/Type' import {entries} from 'alinea/core/util/Objects' import {FormRow} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' diff --git a/src/field/list/ListField.stories.tsx b/src/field/list/ListField.stories.tsx index b72b1cee6..2ca3bbd5f 100644 --- a/src/field/list/ListField.stories.tsx +++ b/src/field/list/ListField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {list} from 'alinea/field/list/ListField' diff --git a/src/field/list/ListField.tsx b/src/field/list/ListField.tsx index d7fd1e8e0..2cd0fa529 100644 --- a/src/field/list/ListField.tsx +++ b/src/field/list/ListField.tsx @@ -1,5 +1,6 @@ -import {FieldOptions, Schema, WithoutLabel} from 'alinea/core' +import type {FieldOptions, WithoutLabel} from 'alinea/core/Field' import {Infer} from 'alinea/core/Infer' +import {Schema} from 'alinea/core/Schema' import {ListField} from 'alinea/core/field/ListField' import {listHint} from 'alinea/core/util/Hints' diff --git a/src/field/metadata/MetadataField.stories.tsx b/src/field/metadata/MetadataField.stories.tsx index 47967e1d0..0d324446d 100644 --- a/src/field/metadata/MetadataField.stories.tsx +++ b/src/field/metadata/MetadataField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {metadata} from 'alinea/field/metadata/MetadataField' diff --git a/src/field/metadata/MetadataField.tsx b/src/field/metadata/MetadataField.tsx index 5e478e503..3b4eaad78 100644 --- a/src/field/metadata/MetadataField.tsx +++ b/src/field/metadata/MetadataField.tsx @@ -1,4 +1,5 @@ -import {FieldOptions, Type, WithoutLabel, type} from 'alinea/core' +import type {FieldOptions, WithoutLabel} from 'alinea/core' +import {Type, type} from 'alinea/core/Type' import {RecordField} from 'alinea/core/field/RecordField' import {link} from 'alinea/field/link' import {ObjectField, object} from 'alinea/field/object' diff --git a/src/field/number/NumberField.stories.tsx b/src/field/number/NumberField.stories.tsx index d78e22438..46ed68cbd 100644 --- a/src/field/number/NumberField.stories.tsx +++ b/src/field/number/NumberField.stories.tsx @@ -1,9 +1,9 @@ -import { type } from 'alinea/core' -import { useForm } from 'alinea/dashboard/atoms/FormAtoms' -import { InputForm } from 'alinea/dashboard/editor/InputForm' -import { number } from 'alinea/field/number' -import { VStack } from 'alinea/ui' -import { UIStory } from 'alinea/ui/UIStory' +import {type} from 'alinea/core/Type' +import {useForm} from 'alinea/dashboard/atoms/FormAtoms' +import {InputForm} from 'alinea/dashboard/editor/InputForm' +import {number} from 'alinea/field/number' +import {VStack} from 'alinea/ui' +import {UIStory} from 'alinea/ui/UIStory' const fields = type({ number: number('Number'), diff --git a/src/field/object/ObjectField.browser.tsx b/src/field/object/ObjectField.browser.tsx index a73e8522c..1d175a5e5 100644 --- a/src/field/object/ObjectField.browser.tsx +++ b/src/field/object/ObjectField.browser.tsx @@ -1,4 +1,4 @@ -import {Field} from 'alinea/core' +import {Field} from 'alinea/core/Field' import {FormRow} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {useFieldError, useFieldOptions} from 'alinea/dashboard/editor/UseField' diff --git a/src/field/object/ObjectField.stories.tsx b/src/field/object/ObjectField.stories.tsx index 58bc43f73..bfd247893 100644 --- a/src/field/object/ObjectField.stories.tsx +++ b/src/field/object/ObjectField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {object} from 'alinea/field/object' diff --git a/src/field/object/ObjectField.tsx b/src/field/object/ObjectField.tsx index d343a3f47..5ad014bd6 100644 --- a/src/field/object/ObjectField.tsx +++ b/src/field/object/ObjectField.tsx @@ -1,4 +1,5 @@ -import {FieldOptions, Type, TypeFields, WithoutLabel, type} from 'alinea/core' +import type {FieldOptions, WithoutLabel} from 'alinea/core/Field' +import {Type, TypeFields, type} from 'alinea/core/Type' import {RecordField} from 'alinea/core/field/RecordField' export interface ObjectOptions diff --git a/src/field/path/PathField.browser.tsx b/src/field/path/PathField.browser.tsx index 5b0d9bb23..edfc745e7 100644 --- a/src/field/path/PathField.browser.tsx +++ b/src/field/path/PathField.browser.tsx @@ -1,5 +1,7 @@ -import {Entry, Field, isSeparator, slugify} from 'alinea/core' -import {pathSuffix} from 'alinea/core/EntryFilenames' +import {Entry} from 'alinea/core/Entry' +import {Field} from 'alinea/core/Field' +import {pathSuffix} from 'alinea/core/util/EntryFilenames' +import {isSeparator, slugify} from 'alinea/core/util/Slugs' import {InputLabel} from 'alinea/dashboard' import {useField} from 'alinea/dashboard/editor/UseField' import {useEntryEditor} from 'alinea/dashboard/hook/UseEntryEditor' diff --git a/src/field/path/PathField.stories.tsx b/src/field/path/PathField.stories.tsx index 196bbe8e1..2f6576eb0 100644 --- a/src/field/path/PathField.stories.tsx +++ b/src/field/path/PathField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {text} from 'alinea/field' diff --git a/src/field/richtext/PickTextLink.tsx b/src/field/richtext/PickTextLink.tsx index 9c3a4ce59..7516598f1 100644 --- a/src/field/richtext/PickTextLink.tsx +++ b/src/field/richtext/PickTextLink.tsx @@ -1,4 +1,6 @@ -import {Reference, track, type} from 'alinea/core' +import {Reference} from 'alinea/core/Reference' +import {track} from 'alinea/core/Tracker' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {Modal} from 'alinea/dashboard/view/Modal' diff --git a/src/field/richtext/ReferenceLink.ts b/src/field/richtext/ReferenceLink.ts index 861076e53..652812377 100644 --- a/src/field/richtext/ReferenceLink.ts +++ b/src/field/richtext/ReferenceLink.ts @@ -1,4 +1,4 @@ -import {createId} from 'alinea/core' +import {createId} from 'alinea/core/Id' import {Reference} from 'alinea/core/Reference' import {EntryReference, FileReference} from 'alinea/picker/entry/EntryReference' import {UrlReference} from 'alinea/picker/url' diff --git a/src/field/richtext/RichText.stories.tsx b/src/field/richtext/RichText.stories.tsx index db3a2ff97..7b70e05ca 100644 --- a/src/field/richtext/RichText.stories.tsx +++ b/src/field/richtext/RichText.stories.tsx @@ -1,4 +1,5 @@ -import {TextDoc, type} from 'alinea/core' +import type {TextDoc} from 'alinea/core/TextDoc' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {richText} from 'alinea/field/richtext' diff --git a/src/field/richtext/RichTextField.browser.tsx b/src/field/richtext/RichTextField.browser.tsx index 7a9b7f057..c51343844 100644 --- a/src/field/richtext/RichTextField.browser.tsx +++ b/src/field/richtext/RichTextField.browser.tsx @@ -7,8 +7,11 @@ import { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react' -import {createId, Field, Schema, Type} from 'alinea/core' +import {Field} from 'alinea/core/Field' import {RichTextField} from 'alinea/core/field/RichTextField' +import {createId} from 'alinea/core/Id' +import {Schema} from 'alinea/core/Schema' +import {Type} from 'alinea/core/Type' import {entries} from 'alinea/core/util/Objects' import {FormRow} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' diff --git a/src/field/richtext/RichTextField.tsx b/src/field/richtext/RichTextField.tsx index edd7d4d80..8f570961b 100644 --- a/src/field/richtext/RichTextField.tsx +++ b/src/field/richtext/RichTextField.tsx @@ -1,4 +1,6 @@ -import {FieldOptions, Schema, TextDoc, WithoutLabel} from 'alinea/core' +import type {FieldOptions, WithoutLabel} from 'alinea/core/Field' +import {Schema} from 'alinea/core/Schema' +import type {TextDoc} from 'alinea/core/TextDoc' import {RichTextField} from 'alinea/core/field/RichTextField' import {richTextHint} from 'alinea/core/util/Hints' diff --git a/src/field/select/SelectField.stories.tsx b/src/field/select/SelectField.stories.tsx index ed0b37b33..5fb9d57e8 100644 --- a/src/field/select/SelectField.stories.tsx +++ b/src/field/select/SelectField.stories.tsx @@ -1,4 +1,5 @@ -import {track, type} from 'alinea/core' +import {track} from 'alinea/core/Tracker' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {select} from 'alinea/field/select' diff --git a/src/field/select/SelectField.tsx b/src/field/select/SelectField.tsx index ceee2dd70..0e705fdfa 100644 --- a/src/field/select/SelectField.tsx +++ b/src/field/select/SelectField.tsx @@ -1,9 +1,9 @@ -import {FieldOptions, Label, WithoutLabel} from 'alinea/core' +import {FieldOptions, WithoutLabel} from 'alinea/core' import {Hint} from 'alinea/core/Hint' import {ScalarField} from 'alinea/core/field/ScalarField' /** A string record with option labels */ -export type SelectItems = Record +export type SelectItems = Record /** Optional settings to configure a select field */ export interface SelectConfig extends FieldOptions { @@ -14,7 +14,7 @@ export interface SelectConfig extends FieldOptions { /** Display a minimal version */ inline?: boolean /** Choose a custom placeholder (eg. 'Select an option') */ - placeholder?: Label + placeholder?: string } export interface SelectOptions extends SelectConfig { diff --git a/src/field/tabs/Tabs.browser.tsx b/src/field/tabs/Tabs.browser.tsx index 80178677c..81d8cfece 100644 --- a/src/field/tabs/Tabs.browser.tsx +++ b/src/field/tabs/Tabs.browser.tsx @@ -1,4 +1,5 @@ -import {Section, Type} from 'alinea/core' +import {Section} from 'alinea/core/Section' +import {Type} from 'alinea/core/Type' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {InputLabel} from 'alinea/dashboard/view/InputLabel' import {HStack, TextLabel} from 'alinea/ui' diff --git a/src/field/tabs/Tabs.ts b/src/field/tabs/Tabs.ts index 144a7da7d..5e05cbe99 100644 --- a/src/field/tabs/Tabs.ts +++ b/src/field/tabs/Tabs.ts @@ -1,13 +1,9 @@ -import { - Field, - SectionData, - SectionDefinition, - Type, - UnionToIntersection, - section, - type -} from 'alinea/core' +import {Field} from 'alinea/core/Field' +import type {SectionData, SectionDefinition} from 'alinea/core/Section' +import {section} from 'alinea/core/Section' +import {Type, type} from 'alinea/core/Type' import {entries, fromEntries} from 'alinea/core/util/Objects' +import type {UnionToIntersection} from 'alinea/core/util/Types' export class TabsSection implements SectionData { definition: SectionDefinition diff --git a/src/field/text/TextField.stories.tsx b/src/field/text/TextField.stories.tsx index 1c713bad8..a6998521e 100644 --- a/src/field/text/TextField.stories.tsx +++ b/src/field/text/TextField.stories.tsx @@ -1,4 +1,4 @@ -import {type} from 'alinea/core' +import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' import {text} from 'alinea/field/text' diff --git a/src/field/view/View.browser.tsx b/src/field/view/View.browser.tsx index b3f3e8e9b..f5a3007c7 100644 --- a/src/field/view/View.browser.tsx +++ b/src/field/view/View.browser.tsx @@ -1,4 +1,4 @@ -import {Section} from 'alinea/core' +import {Section} from 'alinea/core/Section' import {ViewSection, view as createView} from './View.js' export * from './View.js' diff --git a/src/field/view/View.ts b/src/field/view/View.ts index 9813e41d0..01661a184 100644 --- a/src/field/view/View.ts +++ b/src/field/view/View.ts @@ -1,4 +1,5 @@ -import {Field, SectionData, SectionDefinition, section} from 'alinea/core' +import {Field} from 'alinea/core/Field' +import {SectionData, SectionDefinition, section} from 'alinea/core/Section' import {ReactNode} from 'react' export class ViewSection implements SectionData { diff --git a/src/index.ts b/src/index.ts index 84078f6f7..cab8f24cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,7 +2,8 @@ import * as alinea from './alinea.js' export {alinea as default} export * as Config from './config.js' -export {Edit, Query} from './core.js' +export {Edit} from './core/Edit.js' +export {Query} from './core/Query.js' export * as Field from './field.js' export * from './types.js' diff --git a/src/picker/entry/EntryPicker.browser.tsx b/src/picker/entry/EntryPicker.browser.tsx index 34b39c3c0..8084e22ae 100644 --- a/src/picker/entry/EntryPicker.browser.tsx +++ b/src/picker/entry/EntryPicker.browser.tsx @@ -1,15 +1,12 @@ -import { - PickerProps, - Root, - WorkspaceData, - createId, - pickerWithView -} from 'alinea/core' import {Entry} from 'alinea/core/Entry' -import {workspaceMediaDir} from 'alinea/core/EntryFilenames' +import {createId} from 'alinea/core/Id' +import {PickerProps, pickerWithView} from 'alinea/core/Picker' import {Reference} from 'alinea/core/Reference' +import {Root} from 'alinea/core/Root' +import {WorkspaceData} from 'alinea/core/Workspace' import {isMediaRoot} from 'alinea/core/media/MediaRoot' import {Expr} from 'alinea/core/pages/Expr' +import {workspaceMediaDir} from 'alinea/core/util/EntryFilenames' import {entries} from 'alinea/core/util/Objects' import {useConfig} from 'alinea/dashboard/hook/UseConfig' import {useFocusList} from 'alinea/dashboard/hook/UseFocusList' diff --git a/src/picker/entry/EntryPicker.ts b/src/picker/entry/EntryPicker.ts index df8abb9e4..81cbeaa00 100644 --- a/src/picker/entry/EntryPicker.ts +++ b/src/picker/entry/EntryPicker.ts @@ -1,10 +1,10 @@ -import {Picker} from 'alinea/core' import {Entry} from 'alinea/core/Entry' import {Hint} from 'alinea/core/Hint' import {Label} from 'alinea/core/Label' +import {Picker} from 'alinea/core/Picker' import {Reference} from 'alinea/core/Reference' import {Type, type} from 'alinea/core/Type' -import {MediaFile} from 'alinea/core/media/MediaSchema' +import {MediaFile} from 'alinea/core/media/MediaTypes' import type {Condition} from 'alinea/core/pages/Expr' import {Projection} from 'alinea/core/pages/Projection' import {RecordShape} from 'alinea/core/shape/RecordShape' diff --git a/src/picker/entry/EntryPickerRow.tsx b/src/picker/entry/EntryPickerRow.tsx index 7f5feeb5b..4db6b2859 100644 --- a/src/picker/entry/EntryPickerRow.tsx +++ b/src/picker/entry/EntryPickerRow.tsx @@ -1,4 +1,4 @@ -import {Type} from 'alinea/core' +import {Type} from 'alinea/core/Type' import {useConfig} from 'alinea/dashboard/hook/UseConfig' import {useEntrySummary} from 'alinea/dashboard/hook/UseEntrySummary' import {EntrySummaryRow} from 'alinea/dashboard/view/entry/EntrySummary' diff --git a/src/picker/url/UrlPicker.browser.tsx b/src/picker/url/UrlPicker.browser.tsx index 190878d6a..d0a3b3e2a 100644 --- a/src/picker/url/UrlPicker.browser.tsx +++ b/src/picker/url/UrlPicker.browser.tsx @@ -1,4 +1,5 @@ -import {PickerProps, createId, pickerWithView} from 'alinea/core' +import {createId} from 'alinea/core/Id' +import {PickerProps, pickerWithView} from 'alinea/core/Picker' import {type} from 'alinea/core/Type' import {useForm} from 'alinea/dashboard/atoms/FormAtoms' import {InputForm} from 'alinea/dashboard/editor/InputForm' diff --git a/src/picker/url/UrlPicker.ts b/src/picker/url/UrlPicker.ts index f0c594991..6f7b511e2 100644 --- a/src/picker/url/UrlPicker.ts +++ b/src/picker/url/UrlPicker.ts @@ -1,5 +1,5 @@ -import {Picker} from 'alinea/core' import {Hint} from 'alinea/core/Hint' +import {Picker} from 'alinea/core/Picker' import {Reference} from 'alinea/core/Reference' import {Type, type} from 'alinea/core/Type' import {RecordShape} from 'alinea/core/shape/RecordShape' diff --git a/src/types.ts b/src/types.ts index 8581f986f..cb068df43 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,12 +1,10 @@ -export type { - Config, - Infer, - Root, - Schema, - TextDoc, - Type, - Workspace -} from 'alinea/core' +export type {Config} from 'alinea/core/Config' +export type {Infer} from 'alinea/core/Infer' +export {Root} from 'alinea/core/Root' +export type {Schema} from 'alinea/core/Schema' +export type {TextDoc} from 'alinea/core/TextDoc' +export type {Type} from 'alinea/core/Type' +export {Workspace} from 'alinea/core/Workspace' export type { EntryReference, FileReference, diff --git a/src/ui/Avatar.tsx b/src/ui/Avatar.tsx index ab90510b5..37117f706 100644 --- a/src/ui/Avatar.tsx +++ b/src/ui/Avatar.tsx @@ -1,4 +1,4 @@ -import {User} from 'alinea/core' +import {User} from 'alinea/core/User' import {getRandomColor} from 'alinea/core/util/GetRandomColor' import {useContrastColor} from './hook/UseContrastColor.js' import {px} from './util/Units.js' diff --git a/src/ui/RichText.tsx b/src/ui/RichText.tsx index 9671549d0..021011c8d 100644 --- a/src/ui/RichText.tsx +++ b/src/ui/RichText.tsx @@ -1,11 +1,8 @@ -import { - Infer, - RichTextElements, - Schema, - TextDoc, - TextNode, - slugify -} from 'alinea/core' +import {Infer} from 'alinea/core/Infer' +import {Schema} from 'alinea/core/Schema' +import {TextDoc, TextNode} from 'alinea/core/TextDoc' +import {RichTextElements} from 'alinea/core/shape/RichTextShape' +import {slugify} from 'alinea/core/util/Slugs' import {ComponentType, Fragment, ReactElement, isValidElement} from 'react' type Element = keyof typeof RichTextElements diff --git a/src/ui/TextLabel.tsx b/src/ui/TextLabel.tsx index 169c06cdd..d7ef2af0c 100644 --- a/src/ui/TextLabel.tsx +++ b/src/ui/TextLabel.tsx @@ -1,11 +1,9 @@ -import {Label} from 'alinea/core' import {HTMLProps} from 'react' export type TextLabelProps = { - label: Label + label: string } & Omit, 'label'> export function TextLabel({label, ...props}: TextLabelProps) { - if (typeof label !== 'string') throw 'Todo: translated labels' return {label} } diff --git a/tsconfig.json b/tsconfig.json index 7c392fa3c..4e8082ca4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -19,7 +19,9 @@ "paths": { "alinea/*": ["./src/*.browser", "./src/*.js", "./src/*"] }, - "rootDir": "src" + "baseUrl": ".", + "rootDir": "src", + "moduleDetection": "force" }, "include": ["src"] } diff --git a/yarn.lock b/yarn.lock index 9eff077ea..2a5f447ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -464,6 +464,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.21.4": + version: 7.23.9 + resolution: "@babel/parser@npm:7.23.9" + bin: + parser: ./bin/babel-parser.js + checksum: e7cd4960ac8671774e13803349da88d512f9292d7baa952173260d3e8f15620a28a3701f14f709d769209022f9e7b79965256b8be204fc550cfe783cdcabe7c7 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": version: 7.23.5 resolution: "@babel/parser@npm:7.23.5" @@ -639,6 +648,16 @@ __metadata: languageName: node linkType: hard +"@dependents/detective-less@npm:^3.0.1": + version: 3.0.2 + resolution: "@dependents/detective-less@npm:3.0.2" + dependencies: + gonzales-pe: ^4.3.0 + node-source-walk: ^5.0.1 + checksum: 2c263ab64fcd1f76117bc35f2b29a150c64bd2b105c96a909a63ce2f2baf07efd93d9ae80e612161d003fb71fbe46598292375f5cc3f447a1b83cfb545dc8f8f + languageName: node + linkType: hard + "@dnd-kit/accessibility@npm:^3.0.0": version: 3.0.0 resolution: "@dnd-kit/accessibility@npm:3.0.0" @@ -2488,6 +2507,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/types@npm:4.33.0" + checksum: 3baae1ca35872421b4eb60f5d3f3f32dc1d513f2ae0a67dee28c7d159fd7a43ed0d11a8a5a0f0c2d38507ffa036fc7c511cb0f18a5e8ac524b3ebde77390ec53 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:5.59.2": version: 5.59.2 resolution: "@typescript-eslint/types@npm:5.59.2" @@ -2495,6 +2521,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:5.59.2": version: 5.59.2 resolution: "@typescript-eslint/typescript-estree@npm:5.59.2" @@ -2513,6 +2546,52 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:^4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/typescript-estree@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + "@typescript-eslint/visitor-keys": 4.33.0 + debug: ^4.3.1 + globby: ^11.0.3 + is-glob: ^4.0.1 + semver: ^7.3.5 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 2566984390c76bd95f43240057215c068c69769e406e27aba41e9f21fd300074d6772e4983fa58fe61e80eb5550af1548d2e31e80550d92ba1d051bb00fe6f5c + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:^5.55.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + "@typescript-eslint/visitor-keys": 5.62.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:4.33.0": + version: 4.33.0 + resolution: "@typescript-eslint/visitor-keys@npm:4.33.0" + dependencies: + "@typescript-eslint/types": 4.33.0 + eslint-visitor-keys: ^2.0.0 + checksum: 59953e474ad4610c1aa23b2b1a964445e2c6201521da6367752f37939d854352bbfced5c04ea539274065e012b1337ba3ffa49c2647a240a4e87155378ba9873 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:5.59.2": version: 5.59.2 resolution: "@typescript-eslint/visitor-keys@npm:5.59.2" @@ -2523,6 +2602,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + eslint-visitor-keys: ^3.3.0 + checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + languageName: node + linkType: hard + "@typescript/analyze-trace@npm:^0.9.1": version: 0.9.1 resolution: "@typescript/analyze-trace@npm:0.9.1" @@ -2701,6 +2790,7 @@ __metadata: esbuild: ^0.19.12 esbx: ^0.0.18 glob: ^7.2.0 + madge: ^6.1.0 npm-run-all: ^4.1.5 postcss-modules: ^6.0.0 postcss-pxtorem: ^6.0.0 @@ -2797,6 +2887,13 @@ __metadata: languageName: node linkType: hard +"any-promise@npm:^1.1.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 0ee8a9bdbe882c90464d75d1f55cf027f5458650c4bd1f0467e65aec38ccccda07ca5844969ee77ed46d04e7dded3eaceb027e8d32f385688523fe305fa7e1de + languageName: node + linkType: hard + "anymatch@npm:~3.1.2": version: 3.1.2 resolution: "anymatch@npm:3.1.2" @@ -2807,6 +2904,13 @@ __metadata: languageName: node linkType: hard +"app-module-path@npm:^2.2.0": + version: 2.2.0 + resolution: "app-module-path@npm:2.2.0" + checksum: b52aa49cfa809efbad41b514222e8ef3f8ee9e147f5eccf79280b45eddcc61f7aeb302b0049474e3f42072dd53a28348c57dd96f36cd461d2e31cc8ab1ef56b5 + languageName: node + linkType: hard + "aproba@npm:^1.0.3": version: 1.2.0 resolution: "aproba@npm:1.2.0" @@ -2907,6 +3011,27 @@ __metadata: languageName: node linkType: hard +"ast-module-types@npm:^2.7.1": + version: 2.7.1 + resolution: "ast-module-types@npm:2.7.1" + checksum: 6238647bcf34eeff2a1390cb60388da8a5064dd598acf48d68f8d972d9a332dc8d0382a5a7c511b16470e314b313bcbb95de4b0b669515393e043282c0489538 + languageName: node + linkType: hard + +"ast-module-types@npm:^3.0.0": + version: 3.0.0 + resolution: "ast-module-types@npm:3.0.0" + checksum: c6ef35d9b286f84c7942aeb0e2b50e389e0b6f44ee3b6d2c46aeed4852dbca0681dde8c3c0ec1d456dad5dbc84fced2e1c607b10b4b4c3b065b901b40f45bbe7 + languageName: node + linkType: hard + +"ast-module-types@npm:^4.0.0": + version: 4.0.0 + resolution: "ast-module-types@npm:4.0.0" + checksum: 12705ff906e57d1440a2ff82f30cf5b3c93e1734076ea5868936477d5812a6fc257eb1e44fb2b7f8c22f7483987251d72251d2a295542f64df8768434f3f06db + languageName: node + linkType: hard + "ast-types-flow@npm:^0.0.7": version: 0.0.7 resolution: "ast-types-flow@npm:0.0.7" @@ -3493,7 +3618,7 @@ __metadata: languageName: node linkType: hard -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": +"color-name@npm:^1.0.0, color-name@npm:^1.1.4, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 @@ -3541,6 +3666,34 @@ __metadata: languageName: node linkType: hard +"commander@npm:^2.16.0, commander@npm:^2.20.3, commander@npm:^2.8.1": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + +"commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + languageName: node + linkType: hard + +"commander@npm:^9.5.0": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + languageName: node + linkType: hard + +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb + languageName: node + linkType: hard + "compare-versions@npm:^4.1.3": version: 4.1.3 resolution: "compare-versions@npm:4.1.3" @@ -3721,7 +3874,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.0.0, debug@npm:^4.3.1, debug@npm:^4.3.4": +"debug@npm:^4.0.0, debug@npm:^4.3.1, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -3902,6 +4055,21 @@ __metadata: languageName: node linkType: hard +"dependency-tree@npm:^9.0.0": + version: 9.0.0 + resolution: "dependency-tree@npm:9.0.0" + dependencies: + commander: ^2.20.3 + debug: ^4.3.1 + filing-cabinet: ^3.0.1 + precinct: ^9.0.0 + typescript: ^4.0.0 + bin: + dependency-tree: bin/cli.js + checksum: 38f95ec248f350f3ed443e0aac520c8ad979b3801262a1e67f6a5972c14f972887150d88972fb9e2630cef8c75efcd82719f93a55f9fc3207e64174ab9d3b0f3 + languageName: node + linkType: hard + "dequal@npm:^2.0.0": version: 2.0.2 resolution: "dequal@npm:2.0.2" @@ -3930,6 +4098,191 @@ __metadata: languageName: node linkType: hard +"detective-amd@npm:^3.1.0": + version: 3.1.2 + resolution: "detective-amd@npm:3.1.2" + dependencies: + ast-module-types: ^3.0.0 + escodegen: ^2.0.0 + get-amd-module-type: ^3.0.0 + node-source-walk: ^4.2.0 + bin: + detective-amd: bin/cli.js + checksum: 0b71555edad8e85c9a2ae85e2799d5faf2bdfe0de969587c9288ca76e717494678e34f444dffe32ffdd432e85ce50ca7017a5d0441a4855677a45a40c4590c74 + languageName: node + linkType: hard + +"detective-amd@npm:^4.0.1, detective-amd@npm:^4.1.0": + version: 4.2.0 + resolution: "detective-amd@npm:4.2.0" + dependencies: + ast-module-types: ^4.0.0 + escodegen: ^2.0.0 + get-amd-module-type: ^4.1.0 + node-source-walk: ^5.0.1 + bin: + detective-amd: bin/cli.js + checksum: c1e829a3202045796105680c9fe90ac61f63b0ccecc12cc30c7204c9e7ec22a4e2c3e2357719b9346a4e3579eba778cdce9a050e642938e2a4c8b57b091278e4 + languageName: node + linkType: hard + +"detective-cjs@npm:^3.1.1": + version: 3.1.3 + resolution: "detective-cjs@npm:3.1.3" + dependencies: + ast-module-types: ^3.0.0 + node-source-walk: ^4.0.0 + checksum: a691cb4afbbfea59d9aae0ee00752ec1a825a7ef18fc9178b53664975f162f3b537268590def009d9ce1cccfc5bc4f38cf775df08d0872aaacc05d96c72de85a + languageName: node + linkType: hard + +"detective-cjs@npm:^4.0.0, detective-cjs@npm:^4.1.0": + version: 4.1.0 + resolution: "detective-cjs@npm:4.1.0" + dependencies: + ast-module-types: ^4.0.0 + node-source-walk: ^5.0.1 + checksum: 17e40183959e9f377333a9fd03dcf4cbabf1b7a9f588882311066ecaaad68ad16765a7b63ffc096fc91d2a3c14ac044ed1823257c76105c9cb96dfc141a806e2 + languageName: node + linkType: hard + +"detective-es6@npm:^2.2.1": + version: 2.2.2 + resolution: "detective-es6@npm:2.2.2" + dependencies: + node-source-walk: ^4.0.0 + checksum: 9ee9909c089f5dcd1f89eccd347d509197996280ba24e2e08742bbc5ca3eef655ff07b4edfd76b52d6b4376ba03b8ec17d621c9f9c4382a6ba233dc1b1d00d33 + languageName: node + linkType: hard + +"detective-es6@npm:^3.0.0, detective-es6@npm:^3.0.1": + version: 3.0.1 + resolution: "detective-es6@npm:3.0.1" + dependencies: + node-source-walk: ^5.0.0 + checksum: 881a0c16b49504c212e61a521231ebbb4299a6102b178230959c74d2ca22d5f7538dfaf9518d01fb568ff93eadcf61d865d4428c9fed893dd4c91a7f29d515c5 + languageName: node + linkType: hard + +"detective-less@npm:^1.0.2": + version: 1.0.2 + resolution: "detective-less@npm:1.0.2" + dependencies: + debug: ^4.0.0 + gonzales-pe: ^4.2.3 + node-source-walk: ^4.0.0 + checksum: 858936fbad87423bd5d7502ff5fafca023e7c99e4006ed01b31c12c4b5ff8697edce91419798479d857efec68ee8f022fcac64de5530db6a64012be600a2249e + languageName: node + linkType: hard + +"detective-postcss@npm:^4.0.0": + version: 4.0.0 + resolution: "detective-postcss@npm:4.0.0" + dependencies: + debug: ^4.1.1 + is-url: ^1.2.4 + postcss: ^8.1.7 + postcss-values-parser: ^2.0.1 + checksum: e4c9fed31613df43466357fb104c4c5cdaf45a12909f7c1174161a45ebb2ebe77bb0843b3c0c117b68f55c9acb4e0578668298594c7f0108dfb73e54aaec8513 + languageName: node + linkType: hard + +"detective-postcss@npm:^6.1.0, detective-postcss@npm:^6.1.1": + version: 6.1.3 + resolution: "detective-postcss@npm:6.1.3" + dependencies: + is-url: ^1.2.4 + postcss: ^8.4.23 + postcss-values-parser: ^6.0.2 + checksum: 54c58227d5a1ec27e1b2b23bd992d823d0161d80e3d8ff6b202094e9841d53e88ac96a4d4cc9762ba4f09a9e038832b5d7c7a45b5e373c1c995c424a8289857b + languageName: node + linkType: hard + +"detective-sass@npm:^3.0.1": + version: 3.0.2 + resolution: "detective-sass@npm:3.0.2" + dependencies: + gonzales-pe: ^4.3.0 + node-source-walk: ^4.0.0 + checksum: 7489e5ae7dbed2eba89855cea21ad32321e8e92bd9f2d3b925e7feec0dd9aa8b4b865296525275938e573a3be9759715490038103cbc970570a1c48c4f2fd23d + languageName: node + linkType: hard + +"detective-sass@npm:^4.0.1, detective-sass@npm:^4.1.1": + version: 4.1.3 + resolution: "detective-sass@npm:4.1.3" + dependencies: + gonzales-pe: ^4.3.0 + node-source-walk: ^5.0.1 + checksum: 91681e90037cc935f38b2867fab2aa5585848491b3a269dfb44b37721146ff83f57a540d964b15db22dc1f232623568bedfd13470ec7363e6111991d4d3fe573 + languageName: node + linkType: hard + +"detective-scss@npm:^2.0.1": + version: 2.0.2 + resolution: "detective-scss@npm:2.0.2" + dependencies: + gonzales-pe: ^4.3.0 + node-source-walk: ^4.0.0 + checksum: 515ff1b8946ec92baead48ef435efe1ea0f33ee1d98a7537dd700f1d06dd192f9ea0971c10343adcb08b561ab296d01c18a1f62d0b63163a8f4c09885a956e1a + languageName: node + linkType: hard + +"detective-scss@npm:^3.0.0, detective-scss@npm:^3.0.1": + version: 3.1.1 + resolution: "detective-scss@npm:3.1.1" + dependencies: + gonzales-pe: ^4.3.0 + node-source-walk: ^5.0.1 + checksum: 3d9c0468216c822c25572e700b9aba1e2e2797d336b6b84fd455d83ce849263324855008d1e58d6ccdf9c7a4f099e31277b99e885407cd19674e0bb10fc458cd + languageName: node + linkType: hard + +"detective-stylus@npm:^1.0.0": + version: 1.0.3 + resolution: "detective-stylus@npm:1.0.3" + checksum: 2723da93545f3a55a2a7eaa76b50712457af3c93c2b003e95d02f4c240d5e5206a5df99209a4f5b54128c11fc4270c2de1d7316b4f7d02b359483ae74f5a6637 + languageName: node + linkType: hard + +"detective-stylus@npm:^2.0.1": + version: 2.0.1 + resolution: "detective-stylus@npm:2.0.1" + checksum: c701ba6df3e6b5346aa5dd37b8329a9069a20fd7d075933e2e3b819a75922a2adab809143591151e7337183d59c980e6bc64ad6e51ce96de864575221c1b9506 + languageName: node + linkType: hard + +"detective-stylus@npm:^3.0.0": + version: 3.0.0 + resolution: "detective-stylus@npm:3.0.0" + checksum: e82eda490406d289f7b22050423ad69eb1c0f0d88414adaa292de4ab533be3c50d4cf512a9fefba426f3ad20789f0c0db3b0d32f70162112ca89034bbc5ca9d3 + languageName: node + linkType: hard + +"detective-typescript@npm:^7.0.0": + version: 7.0.2 + resolution: "detective-typescript@npm:7.0.2" + dependencies: + "@typescript-eslint/typescript-estree": ^4.33.0 + ast-module-types: ^2.7.1 + node-source-walk: ^4.2.0 + typescript: ^3.9.10 + checksum: 77703410baa242029dc5e7d02cca7a26278dea498ec1c3320f92efa08a85263affc3b102fc2b09952ece1d2c851a3808733d7bfa9ed11944a7c0f39920e33ec9 + languageName: node + linkType: hard + +"detective-typescript@npm:^9.0.0, detective-typescript@npm:^9.1.1": + version: 9.1.1 + resolution: "detective-typescript@npm:9.1.1" + dependencies: + "@typescript-eslint/typescript-estree": ^5.55.0 + ast-module-types: ^4.0.0 + node-source-walk: ^5.0.1 + typescript: ^4.9.5 + checksum: 5f50801f622740d4e9d724ce04518ceb81591215bf18c18c5d22f6f3948df49dfb0a8bbe3596dac47220a37028bc2879ccd7a968f265217c9855817bda4622f5 + languageName: node + linkType: hard + "devlop@npm:^1.0.0, devlop@npm:^1.1.0": version: 1.1.0 resolution: "devlop@npm:1.1.0" @@ -4118,6 +4471,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.8.3": + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 + languageName: node + linkType: hard + "entities@npm:^4.2.0, entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -4402,6 +4765,24 @@ __metadata: languageName: node linkType: hard +"escodegen@npm:^2.0.0": + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" + dependencies: + esprima: ^4.0.1 + estraverse: ^5.2.0 + esutils: ^2.0.2 + source-map: ~0.6.1 + dependenciesMeta: + source-map: + optional: true + bin: + escodegen: bin/escodegen.js + esgenerate: bin/esgenerate.js + checksum: 096696407e161305cd05aebb95134ad176708bc5cb13d0dcc89a5fcbb959b8ed757e7f2591a5f8036f8f4952d4a724de0df14cd419e29212729fa6df5ce16bf6 + languageName: node + linkType: hard + "eslint-config-next@npm:13.4.0": version: 13.4.0 resolution: "eslint-config-next@npm:13.4.0" @@ -4562,6 +4943,13 @@ __metadata: languageName: node linkType: hard +"eslint-visitor-keys@npm:^2.0.0": + version: 2.1.0 + resolution: "eslint-visitor-keys@npm:2.1.0" + checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d + languageName: node + linkType: hard + "eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.0, eslint-visitor-keys@npm:^3.4.1": version: 3.4.1 resolution: "eslint-visitor-keys@npm:3.4.1" @@ -4630,6 +5018,16 @@ __metadata: languageName: node linkType: hard +"esprima@npm:^4.0.0, esprima@npm:^4.0.1": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + languageName: node + linkType: hard + "esquery@npm:^1.4.2": version: 1.5.0 resolution: "esquery@npm:1.5.0" @@ -4880,6 +5278,29 @@ __metadata: languageName: node linkType: hard +"filing-cabinet@npm:^3.0.1": + version: 3.3.1 + resolution: "filing-cabinet@npm:3.3.1" + dependencies: + app-module-path: ^2.2.0 + commander: ^2.20.3 + debug: ^4.3.3 + enhanced-resolve: ^5.8.3 + is-relative-path: ^1.0.2 + module-definition: ^3.3.1 + module-lookup-amd: ^7.0.1 + resolve: ^1.21.0 + resolve-dependency-path: ^2.0.0 + sass-lookup: ^3.0.0 + stylus-lookup: ^3.0.1 + tsconfig-paths: ^3.10.1 + typescript: ^3.9.7 + bin: + filing-cabinet: bin/cli.js + checksum: f6511c2e93e236c0d882244b49936a2c8cb2fde47e0d1a0a93345ce171995c2734670c38ed1c0aceaee9ed4958fcce48bfbbb687efe4dedf04b6ea46b0a8c1c0 + languageName: node + linkType: hard + "fill-range@npm:^7.0.1": version: 7.0.1 resolution: "fill-range@npm:7.0.1" @@ -4923,6 +5344,13 @@ __metadata: languageName: node linkType: hard +"flatten@npm:^1.0.2": + version: 1.0.3 + resolution: "flatten@npm:1.0.3" + checksum: 5c57379816f1692aaa79fbc6390e0a0644e5e8442c5783ed57c6d315468eddbc53a659eaa03c9bb1e771b0f4a9bd8dd8a2620286bf21fd6538a7857321fdfb20 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -5018,6 +5446,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + "function.prototype.name@npm:^1.1.5": version: 1.1.5 resolution: "function.prototype.name@npm:1.1.5" @@ -5069,6 +5504,26 @@ fsevents@~2.3.2: languageName: node linkType: hard +"get-amd-module-type@npm:^3.0.0": + version: 3.0.2 + resolution: "get-amd-module-type@npm:3.0.2" + dependencies: + ast-module-types: ^3.0.0 + node-source-walk: ^4.2.2 + checksum: d16fac5037f63027992e6ebd2d642e6d4feef2f8fa71ff3da6aa76006e05b3dcd4aa6044b4c5966f13ba5d412fd7c1367d910df86b58f9c13f53cbb35d2e4b72 + languageName: node + linkType: hard + +"get-amd-module-type@npm:^4.1.0": + version: 4.1.0 + resolution: "get-amd-module-type@npm:4.1.0" + dependencies: + ast-module-types: ^4.0.0 + node-source-walk: ^5.0.1 + checksum: dd3f58e88efb6a2224bb38325fe21b1ab417ba105b7f90d49089141b0eb3c24aab1866a2e2bf370430bbfc7ef226fc0a2a5c657e161d1d42d8a243f44ebd4fbe + languageName: node + linkType: hard + "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" @@ -5098,6 +5553,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"get-own-enumerable-property-symbols@npm:^3.0.0": + version: 3.0.2 + resolution: "get-own-enumerable-property-symbols@npm:3.0.2" + checksum: 8f0331f14159f939830884799f937343c8c0a2c330506094bc12cbee3665d88337fe97a4ea35c002cc2bdba0f5d9975ad7ec3abb925015cdf2a93e76d4759ede + languageName: node + linkType: hard + "get-port@npm:^7.0.0": version: 7.0.0 resolution: "get-port@npm:7.0.0" @@ -5225,7 +5687,7 @@ fsevents@~2.3.2: languageName: node linkType: hard -"globby@npm:^11.1.0": +"globby@npm:^11.0.3, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -5273,6 +5735,17 @@ fsevents@~2.3.2: languageName: node linkType: hard +"gonzales-pe@npm:^4.2.3, gonzales-pe@npm:^4.3.0": + version: 4.3.0 + resolution: "gonzales-pe@npm:4.3.0" + dependencies: + minimist: ^1.2.5 + bin: + gonzales: bin/gonzales.js + checksum: 49d60fc49ad35639e5d55923c1516d3ec2e4de5e6e5913ec3458a479b66623e54a060d568295349b0bb9f96ee970c473ff984d4b82a5cfeaf736c55f0d6dc3b7 + languageName: node + linkType: hard + "gopd@npm:^1.0.1": version: 1.0.1 resolution: "gopd@npm:1.0.1" @@ -5393,6 +5866,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + languageName: node + linkType: hard + "hast-util-classnames@npm:^3.0.0": version: 3.0.0 resolution: "hast-util-classnames@npm:3.0.0" @@ -5891,6 +6373,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"indexes-of@npm:^1.0.1": + version: 1.0.1 + resolution: "indexes-of@npm:1.0.1" + checksum: 4f9799b1739a62f3e02d09f6f4162cf9673025282af7fa36e790146e7f4e216dad3e776a25b08536c093209c9fcb5ea7bd04b082d42686a45f58ff401d6da32e + languageName: node + linkType: hard + "infer-owner@npm:^1.0.4": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" @@ -6098,6 +6587,15 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + languageName: node + linkType: hard + "is-core-module@npm:^2.2.0": version: 2.6.0 resolution: "is-core-module@npm:2.6.0" @@ -6301,6 +6799,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-obj@npm:^1.0.1": + version: 1.0.1 + resolution: "is-obj@npm:1.0.1" + checksum: 3ccf0efdea12951e0b9c784e2b00e77e87b2f8bd30b42a498548a8afcc11b3287342a2030c308e473e93a7a19c9ea7854c99a8832a476591c727df2a9c79796c + languageName: node + linkType: hard + "is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" @@ -6343,6 +6848,20 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-regexp@npm:^1.0.0": + version: 1.0.0 + resolution: "is-regexp@npm:1.0.0" + checksum: be692828e24cba479ec33644326fa98959ec68ba77965e0291088c1a741feaea4919d79f8031708f85fd25e39de002b4520622b55460660b9c369e6f7187faef + languageName: node + linkType: hard + +"is-relative-path@npm:^1.0.2": + version: 1.0.2 + resolution: "is-relative-path@npm:1.0.2" + checksum: 6c2ccffd3c0a3e3990535d0571370883d558b825b51940085f3446ec338857f4552f44521dfec3e83b7e067de08c0b0369de290208a91200bcae2c569533e340 + languageName: node + linkType: hard + "is-set@npm:^2.0.1, is-set@npm:^2.0.2": version: 2.0.2 resolution: "is-set@npm:2.0.2" @@ -6411,6 +6930,20 @@ fsevents@~2.3.2: languageName: node linkType: hard +"is-url-superb@npm:^4.0.0": + version: 4.0.0 + resolution: "is-url-superb@npm:4.0.0" + checksum: fd55e91c96349acb0d688f95fcb1ac67450e5db934976e3a8ff13ef446841e779a6f4d18b15f02331f05a3429c8fdaba2382ac1ab444059e86e9ffcde1ec8db0 + languageName: node + linkType: hard + +"is-url@npm:^1.2.4": + version: 1.2.4 + resolution: "is-url@npm:1.2.4" + checksum: 100e74b3b1feab87a43ef7653736e88d997eb7bd32e71fd3ebc413e58c1cbe56269699c776aaea84244b0567f2a7d68dfaa512a062293ed2f9fdecb394148432 + languageName: node + linkType: hard + "is-weakmap@npm:^2.0.1": version: 2.0.1 resolution: "is-weakmap@npm:2.0.1" @@ -6920,6 +7453,43 @@ fsevents@~2.3.2: languageName: node linkType: hard +"madge@npm:^6.1.0": + version: 6.1.0 + resolution: "madge@npm:6.1.0" + dependencies: + chalk: ^4.1.1 + commander: ^7.2.0 + commondir: ^1.0.1 + debug: ^4.3.1 + dependency-tree: ^9.0.0 + detective-amd: ^4.0.1 + detective-cjs: ^4.0.0 + detective-es6: ^3.0.0 + detective-less: ^1.0.2 + detective-postcss: ^6.1.0 + detective-sass: ^4.0.1 + detective-scss: ^3.0.0 + detective-stylus: ^2.0.1 + detective-typescript: ^9.0.0 + ora: ^5.4.1 + pluralize: ^8.0.0 + precinct: ^8.1.0 + pretty-ms: ^7.0.1 + rc: ^1.2.7 + stream-to-array: ^2.3.0 + ts-graphviz: ^1.5.0 + walkdir: ^0.4.1 + peerDependencies: + typescript: ^3.9.5 || ^4.9.5 || ^5 + peerDependenciesMeta: + typescript: + optional: true + bin: + madge: bin/cli.js + checksum: cb8a629c1eb837640ca2416dbd2236f1ea8657eb188725ff42294718dd1769ece5ec635ef02c344c72e3b4faab3cd8f084b043ce8ecccf4018915738b3329096 + languageName: node + linkType: hard + "make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -8200,6 +8770,45 @@ fsevents@~2.3.2: languageName: node linkType: hard +"module-definition@npm:^3.3.1": + version: 3.4.0 + resolution: "module-definition@npm:3.4.0" + dependencies: + ast-module-types: ^3.0.0 + node-source-walk: ^4.0.0 + bin: + module-definition: bin/cli.js + checksum: 5cbfd38aab1a9169b5c31924e208e430a87a1b1512ab9736a9a368d950e3cc8e2f5cf642e37fe74123e25402cae50bfb8fdf1f5f0fd3d4d9270df705a2360bfa + languageName: node + linkType: hard + +"module-definition@npm:^4.1.0": + version: 4.1.0 + resolution: "module-definition@npm:4.1.0" + dependencies: + ast-module-types: ^4.0.0 + node-source-walk: ^5.0.1 + bin: + module-definition: bin/cli.js + checksum: d9b6397c9ba04b08bc035fd87a3652900530b9a5d6e5263f8a1e05c927dfc103fdffcecd7071a9fd6cd7813fc9feafbbe828f5277e5b706e5de82831153ef0fb + languageName: node + linkType: hard + +"module-lookup-amd@npm:^7.0.1": + version: 7.0.1 + resolution: "module-lookup-amd@npm:7.0.1" + dependencies: + commander: ^2.8.1 + debug: ^4.1.0 + glob: ^7.1.6 + requirejs: ^2.3.5 + requirejs-config-file: ^4.0.0 + bin: + lookup-amd: bin/cli.js + checksum: 911abd6b8fb1d82cfae4ef38050981d4eb7e710bfeba898903c5c49a4d3a44b3cacb6201ddf9930a39fae3473faf9b96d39930cfa8766dbf0da86689108895b1 + languageName: node + linkType: hard + "mri@npm:^1.1.0": version: 1.1.6 resolution: "mri@npm:1.1.6" @@ -8436,6 +9045,24 @@ fsevents@~2.3.2: languageName: node linkType: hard +"node-source-walk@npm:^4.0.0, node-source-walk@npm:^4.2.0, node-source-walk@npm:^4.2.2": + version: 4.3.0 + resolution: "node-source-walk@npm:4.3.0" + dependencies: + "@babel/parser": ^7.0.0 + checksum: 124bcec61f73141a5f13e63f773beb00c9a9620e9eec6d7505b9de8fa884797f3eb0b9e9d225bb324930234ae03b28a4a7a231e2c2f23d71405d4a562b404e34 + languageName: node + linkType: hard + +"node-source-walk@npm:^5.0.0, node-source-walk@npm:^5.0.1": + version: 5.0.2 + resolution: "node-source-walk@npm:5.0.2" + dependencies: + "@babel/parser": ^7.21.4 + checksum: 1031bc0871bb77ace33bd09fb1e9ef7589b03e6a2fa441b8e684023102362da6dba77d6b9b086dc1f995c7e69e3517666d5316c3831b9d9ff077cb36d57179e8 + languageName: node + linkType: hard + "nodemailer@npm:^6.9.9": version: 6.9.9 resolution: "nodemailer@npm:6.9.9" @@ -9050,6 +9677,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"pluralize@npm:^8.0.0": + version: 8.0.0 + resolution: "pluralize@npm:8.0.0" + checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e + languageName: node + linkType: hard + "postcss-load-config@npm:^3.1.4": version: 3.1.4 resolution: "postcss-load-config@npm:3.1.4" @@ -9156,6 +9790,30 @@ fsevents@~2.3.2: languageName: node linkType: hard +"postcss-values-parser@npm:^2.0.1": + version: 2.0.1 + resolution: "postcss-values-parser@npm:2.0.1" + dependencies: + flatten: ^1.0.2 + indexes-of: ^1.0.1 + uniq: ^1.0.1 + checksum: 050877880937e15af8d18bf48902e547e2123d7cc32c1f215b392642bc5e2598a87a341995d62f38e450aab4186b8afeb2c9541934806d458ad8b117020b2ebf + languageName: node + linkType: hard + +"postcss-values-parser@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-values-parser@npm:6.0.2" + dependencies: + color-name: ^1.1.4 + is-url-superb: ^4.0.0 + quote-unquote: ^1.0.0 + peerDependencies: + postcss: ^8.2.9 + checksum: 615fea3d7996b3fae84a8674fb0e7c6bd0bc006beddb126692c2e43112b772625329c5f10121b00d69fe7a24f7f18dd25e24745574556735c4e9671774df0eb1 + languageName: node + linkType: hard + "postcss@npm:8.4.31": version: 8.4.31 resolution: "postcss@npm:8.4.31" @@ -9178,6 +9836,17 @@ fsevents@~2.3.2: languageName: node linkType: hard +"postcss@npm:^8.1.7, postcss@npm:^8.4.23": + version: 8.4.35 + resolution: "postcss@npm:8.4.35" + dependencies: + nanoid: ^3.3.7 + picocolors: ^1.0.0 + source-map-js: ^1.0.2 + checksum: cf3c3124d3912a507603f6d9a49b3783f741075e9aa73eb592a6dd9194f9edab9d20a8875d16d137d4f779fe7b6fbd1f5727e39bfd1c3003724980ee4995e1da + languageName: node + linkType: hard + "postcss@npm:^8.4.32": version: 8.4.33 resolution: "postcss@npm:8.4.33" @@ -9211,6 +9880,51 @@ fsevents@~2.3.2: languageName: node linkType: hard +"precinct@npm:^8.1.0": + version: 8.3.1 + resolution: "precinct@npm:8.3.1" + dependencies: + commander: ^2.20.3 + debug: ^4.3.3 + detective-amd: ^3.1.0 + detective-cjs: ^3.1.1 + detective-es6: ^2.2.1 + detective-less: ^1.0.2 + detective-postcss: ^4.0.0 + detective-sass: ^3.0.1 + detective-scss: ^2.0.1 + detective-stylus: ^1.0.0 + detective-typescript: ^7.0.0 + module-definition: ^3.3.1 + node-source-walk: ^4.2.0 + bin: + precinct: bin/cli.js + checksum: 16ba57e545fc53481b3a194f9d7843cefd562ce5e847280355eed360ca4c55def4d03d501776fb49fdf79bfe84a03ec6138003d8387c0426f6a68e1931688399 + languageName: node + linkType: hard + +"precinct@npm:^9.0.0": + version: 9.2.1 + resolution: "precinct@npm:9.2.1" + dependencies: + "@dependents/detective-less": ^3.0.1 + commander: ^9.5.0 + detective-amd: ^4.1.0 + detective-cjs: ^4.1.0 + detective-es6: ^3.0.1 + detective-postcss: ^6.1.1 + detective-sass: ^4.1.1 + detective-scss: ^3.0.1 + detective-stylus: ^3.0.0 + detective-typescript: ^9.1.1 + module-definition: ^4.1.0 + node-source-walk: ^5.0.1 + bin: + precinct: bin/cli.js + checksum: 0352553cca8aff0baa04412429bbe3fab278e9e574fd9bcb2b1bb87dc3ed608f3e08b66c86aee90eed6bac5c4091fe78753ae094d54b01a803189d3259817fe7 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -9540,6 +10254,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"quote-unquote@npm:^1.0.0": + version: 1.0.0 + resolution: "quote-unquote@npm:1.0.0" + checksum: 955a2ead534f5b6a3f8d4dc5a4b95ac6468213d3fb11f8c1592a0a56345c45a3d14d5ca04d3de2bc9891493fcac38c03dfa91c48a6159aef50124e9c5afcea49 + languageName: node + linkType: hard + "rado@npm:^0.4.8": version: 0.4.8 resolution: "rado@npm:0.4.8" @@ -9903,6 +10624,26 @@ fsevents@~2.3.2: languageName: node linkType: hard +"requirejs-config-file@npm:^4.0.0": + version: 4.0.0 + resolution: "requirejs-config-file@npm:4.0.0" + dependencies: + esprima: ^4.0.0 + stringify-object: ^3.2.1 + checksum: 61ac1c419a8978df9484211827047f0a43d48a97e242ebca9628a2e52da8c739ee068bd67dc4d5dc5fd7be6d1c9a863006bb02df691c86914921fe12713fbebb + languageName: node + linkType: hard + +"requirejs@npm:^2.3.5": + version: 2.3.6 + resolution: "requirejs@npm:2.3.6" + bin: + r.js: ./bin/r.js + r_js: ./bin/r.js + checksum: 7c3c006bf5e1887d93ac7adb7f600328918d23cf3d28282a505a2873d4ddde499c7ec560e55cee3440d17fe1205cb4dcb72b07f35b39e8940372eca850e49b62 + languageName: node + linkType: hard + "reserved-words@npm:^0.1.2": version: 0.1.2 resolution: "reserved-words@npm:0.1.2" @@ -9910,6 +10651,13 @@ fsevents@~2.3.2: languageName: node linkType: hard +"resolve-dependency-path@npm:^2.0.0": + version: 2.0.0 + resolution: "resolve-dependency-path@npm:2.0.0" + checksum: 161296969a0a7853ebb7710847154ffb5bd11a51c370b67a0d0c89cacfcb57063d204587617fd030ea227bfd19a3c4af79d39e9d20ae0fbe354c27598d1ea8a8 + languageName: node + linkType: hard + "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" @@ -9947,6 +10695,19 @@ resolve@^1.10.0: languageName: node linkType: hard +"resolve@npm:^1.21.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + "resolve@npm:^1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" @@ -9996,6 +10757,19 @@ resolve@^1.10.0: languageName: node linkType: hard +"resolve@patch:resolve@^1.21.0#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + "resolve@patch:resolve@^1.22.1#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=07638b" @@ -10198,6 +10972,17 @@ resolve@^1.10.0: languageName: node linkType: hard +"sass-lookup@npm:^3.0.0": + version: 3.0.0 + resolution: "sass-lookup@npm:3.0.0" + dependencies: + commander: ^2.16.0 + bin: + sass-lookup: bin/cli.js + checksum: fd4bf1ad9c54111617dec30dd90aff083e87c96aef50aff6cec443ad2fbbfa65da09f6e67a7e5ef99fa39dff65c937dc7358f18d319e083c6031f21def85ce6d + languageName: node + linkType: hard + "sass@npm:^1.58.3": version: 1.63.6 resolution: "sass@npm:1.63.6" @@ -10532,7 +11317,7 @@ resolve@^1.10.0: languageName: node linkType: hard -"source-map@npm:~0.6.0": +"source-map@npm:~0.6.0, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 @@ -10646,6 +11431,15 @@ resolve@^1.10.0: languageName: node linkType: hard +"stream-to-array@npm:^2.3.0": + version: 2.3.0 + resolution: "stream-to-array@npm:2.3.0" + dependencies: + any-promise: ^1.1.0 + checksum: 7feaf63b38399b850615e6ffcaa951e96e4c8f46745dbce4b553a94c5dc43966933813747014935a3ff97793e7f30a65270bde19f82b2932871a1879229a77cf + languageName: node + linkType: hard + "streamsearch@npm:^1.1.0": version: 1.1.0 resolution: "streamsearch@npm:1.1.0" @@ -10818,6 +11612,17 @@ resolve@^1.10.0: languageName: node linkType: hard +"stringify-object@npm:^3.2.1": + version: 3.3.0 + resolution: "stringify-object@npm:3.3.0" + dependencies: + get-own-enumerable-property-symbols: ^3.0.0 + is-obj: ^1.0.1 + is-regexp: ^1.0.0 + checksum: 6827a3f35975cfa8572e8cd3ed4f7b262def260af18655c6fde549334acdac49ddba69f3c861ea5a6e9c5a4990fe4ae870b9c0e6c31019430504c94a83b7a154 + languageName: node + linkType: hard + "strip-ansi@npm:^3.0.0, strip-ansi@npm:^3.0.1": version: 3.0.1 resolution: "strip-ansi@npm:3.0.1" @@ -10930,6 +11735,18 @@ resolve@^1.10.0: languageName: node linkType: hard +"stylus-lookup@npm:^3.0.1": + version: 3.0.2 + resolution: "stylus-lookup@npm:3.0.2" + dependencies: + commander: ^2.8.1 + debug: ^4.1.0 + bin: + stylus-lookup: bin/cli.js + checksum: 460e9b6e7e662e2cf98d41ee670cb5da9ec8b8dbc1d4574de29ac422c632d5c7933772822fc12792f2ee9f9c2f62b3f60ed5850690e7c780ab7b6f07010199e4 + languageName: node + linkType: hard + "stylus@npm:^0.59.0": version: 0.59.0 resolution: "stylus@npm:0.59.0" @@ -11146,6 +11963,13 @@ resolve@^1.10.0: languageName: node linkType: hard +"ts-graphviz@npm:^1.5.0": + version: 1.8.1 + resolution: "ts-graphviz@npm:1.8.1" + checksum: c560fc3a70fc7743bb1cacd21fdeb68661e78132cad4c0cb53c071d2485b1e5975350f0a754c2a797912e9d9022dc375b47e6b023a2eafe4b824c0bb9b7d58ed + languageName: node + linkType: hard + "tsconfck@npm:^2.1.0": version: 2.1.2 resolution: "tsconfck@npm:2.1.2" @@ -11160,6 +11984,18 @@ resolve@^1.10.0: languageName: node linkType: hard +"tsconfig-paths@npm:^3.10.1": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.2 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: 59f35407a390d9482b320451f52a411a256a130ff0e7543d18c6f20afab29ac19fbe55c360a93d6476213cc335a4d76ce90f67df54c4e9037f7d240920832201 + languageName: node + linkType: hard + "tsconfig-paths@npm:^3.14.1": version: 3.14.2 resolution: "tsconfig-paths@npm:3.14.2" @@ -11373,6 +12209,26 @@ resolve@^1.10.0: languageName: node linkType: hard +"typescript@npm:^3.9.10, typescript@npm:^3.9.7": + version: 3.9.10 + resolution: "typescript@npm:3.9.10" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 46c842e2cd4797b88b66ef06c9c41dd21da48b95787072ccf39d5f2aa3124361bc4c966aa1c7f709fae0509614d76751455b5231b12dbb72eb97a31369e1ff92 + languageName: node + linkType: hard + +"typescript@npm:^4.0.0, typescript@npm:^4.9.5": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + languageName: node + linkType: hard + "typescript@npm:^5.3.3": version: 5.3.3 resolution: "typescript@npm:5.3.3" @@ -11383,6 +12239,26 @@ resolve@^1.10.0: languageName: node linkType: hard +"typescript@patch:typescript@^3.9.10#~builtin, typescript@patch:typescript@^3.9.7#~builtin": + version: 3.9.10 + resolution: "typescript@patch:typescript@npm%3A3.9.10#~builtin::version=3.9.10&hash=bda367" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: dc7141ab555b23a8650a6787f98845fc11692063d02b75ff49433091b3af2fe3d773650dea18389d7c21f47d620fb3b110ea363dab4ab039417a6ccbbaf96fc2 + languageName: node + linkType: hard + +"typescript@patch:typescript@^4.0.0#~builtin, typescript@patch:typescript@^4.9.5#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=bda367" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 2eee5c37cad4390385db5db5a8e81470e42e8f1401b0358d7390095d6f681b410f2c4a0c496c6ff9ebd775423c7785cdace7bcdad76c7bee283df3d9718c0f20 + languageName: node + linkType: hard + "typescript@patch:typescript@^5.3.3#~builtin": version: 5.3.3 resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=bda367" @@ -11461,6 +12337,13 @@ resolve@^1.10.0: languageName: node linkType: hard +"uniq@npm:^1.0.1": + version: 1.0.1 + resolution: "uniq@npm:1.0.1" + checksum: 8206535f83745ea83f9da7035f3b983fd6ed5e35b8ed7745441944e4065b616bc67cf0d0a23a86b40ee0074426f0607f0a138f9b78e124eb6a7a6a6966055709 + languageName: node + linkType: hard + "unique-filename@npm:^1.1.1": version: 1.1.1 resolution: "unique-filename@npm:1.1.1" @@ -11891,6 +12774,13 @@ resolve@^1.10.0: languageName: node linkType: hard +"walkdir@npm:^0.4.1": + version: 0.4.1 + resolution: "walkdir@npm:0.4.1" + checksum: 71045c21dc19aae3321f897b6e9e507cf8039202665c35a0b908eecccaf25636aab769b31cbd61ef8267237fe22fc316923a691ecc2d9d38840a15c59c0f2594 + languageName: node + linkType: hard + "wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1"