diff --git a/examples/content/markdown/authors/tony.md b/examples/content/markdown/authors/tony.md index 416dd8ba..d96c0980 100644 --- a/examples/content/markdown/authors/tony.md +++ b/examples/content/markdown/authors/tony.md @@ -10,9 +10,10 @@ friend: 40s3 image: tony.svg date_joined: 2021-02-25T16:41:59.558Z skills: - sitting: 204 + sitting: 69 breathing: 7.07 - liquid_consumption: 100 + liquid_consumption: 420 existence: simulation sports: -2 --- + diff --git a/examples/nextjs/flatbread.config.ts b/examples/nextjs/flatbread.config.ts index 1d1aa896..d2ae9788 100644 --- a/examples/nextjs/flatbread.config.ts +++ b/examples/nextjs/flatbread.config.ts @@ -19,21 +19,21 @@ export default defineConfig({ content: [ { path: 'content/markdown/posts', - collection: 'Post', + name: 'Post', refs: { authors: 'Author', }, }, { path: 'content/markdown/posts/[category]/[slug].md', - collection: 'PostCategory', + name: 'PostCategory', refs: { authors: 'Author', }, }, { path: 'content/markdown/posts/**/*.md', - collection: 'PostCategoryBlob', + name: 'PostCategoryBlob', refs: { authors: 'Author', }, diff --git a/examples/sveltekit/flatbread.config.js b/examples/sveltekit/flatbread.config.js index 39c65f27..e1af1d40 100644 --- a/examples/sveltekit/flatbread.config.js +++ b/examples/sveltekit/flatbread.config.js @@ -16,31 +16,41 @@ const transformerConfig = { export default defineConfig({ source: sourceFilesystem(), transformer: [transformerMarkdown(transformerConfig), transformerYaml()], + + collectionResolvers: [ + function fakeResolver(schemaComposer, args) { + const { name } = args; + + schemaComposer.Query.addFields({ + [`fake${name}`]: { + type: 'String', + description: `fake resolver`, + resolve() { + return `fake ${name}!`; + }, + }, + }); + }, + ], + content: [ { path: 'content/markdown/posts', - collection: 'Post', + name: 'Post', refs: { authors: 'Author', }, }, { path: 'content/markdown/posts/[category]/[slug].md', - collection: 'PostCategory', - refs: { - authors: 'Author', - }, - }, - { - path: 'content/markdown/posts/**/*.md', - collection: 'PostCategoryBlob', + name: 'PostCategory', refs: { authors: 'Author', }, }, { path: 'content/markdown/authors', - collection: 'Author', + name: 'Author', refs: { friend: 'Author', }, @@ -48,26 +58,24 @@ export default defineConfig({ createSvImgField('image', { inputDir: 'static/authorImages', outputDir: 'static/g', - srcGenerator: (path) => '/g/' + path, + srcGenerator: (path) => 'http://localhost:5174/g/' + path, }), ], }, { path: 'content/yaml/authors', - collection: 'YamlAuthor', + name: 'YamlAuthor', refs: { friend: 'YamlAuthor', }, }, { path: 'content/markdown/deeply-nested', - collection: 'OverrideTest', + name: 'OverrideTest', overrides: [ { field: 'deeply.nested', type: 'String', - test: undefined, - test2: null, resolve: (source) => String(source).toUpperCase(), }, { diff --git a/examples/sveltekit/src/routes/index.svelte b/examples/sveltekit/src/routes/index.svelte index 67cd7ec2..14ba30f8 100644 --- a/examples/sveltekit/src/routes/index.svelte +++ b/examples/sveltekit/src/routes/index.svelte @@ -3,9 +3,13 @@ const query = ` query PostCategory { allPostCategories (sortBy: "title", order: DESC) { - _collection - _filename - _slug + _metadata { + sourceContext { + filename + slug + } + collection + } id title category @@ -18,7 +22,11 @@ timeToRead } authors { - _slug + _metadata { + sourceContext { + slug + } + } id name entity @@ -99,9 +107,7 @@
+
{JSON.stringify(data, null, 2)}
diff --git a/packages/core/package.json b/packages/core/package.json
index b49d91f8..446e7d98 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -35,6 +35,7 @@
"lodash-es": "4.17.21",
"lru-cache": "7.13.2",
"matcher": "5.0.0",
+ "nanoid": "4.0.0",
"plur": "5.1.0"
},
"devDependencies": {
diff --git a/packages/core/src/cache/cache.ts b/packages/core/src/cache/cache.ts
index 6d40d382..fe8fc54c 100644
--- a/packages/core/src/cache/cache.ts
+++ b/packages/core/src/cache/cache.ts
@@ -1,8 +1,7 @@
import { GraphQLSchema } from 'graphql';
import LRU from 'lru-cache';
-import { createHash } from 'node:crypto';
import { LoadedFlatbreadConfig } from '../types';
-import { anyToString } from '../utils/stringUtils';
+import createShaHash from '../utils/createShaHash';
type SchemaCacheKey = string;
@@ -29,7 +28,7 @@ export function cacheSchema(
config: LoadedFlatbreadConfig,
schema: GraphQLSchema
) {
- const schemaHashKey = getSchemaHash(config);
+ const schemaHashKey = createShaHash(config);
cache.schema.set(schemaHashKey, schema);
}
@@ -39,13 +38,6 @@ export function cacheSchema(
export function checkCacheForSchema(
config: LoadedFlatbreadConfig
): GraphQLSchema | undefined {
- const schemaHashKey = getSchemaHash(config);
+ const schemaHashKey = createShaHash(config);
return cache.schema.get(schemaHashKey);
}
-
-/**
- * Generates a hash key for a given Flatbread config.
- */
-export function getSchemaHash(config: LoadedFlatbreadConfig) {
- return createHash('md5').update(anyToString(config)).digest('hex');
-}
diff --git a/packages/core/src/generators/collectionMutations.ts b/packages/core/src/generators/collectionMutations.ts
new file mode 100644
index 00000000..f66dab2f
--- /dev/null
+++ b/packages/core/src/generators/collectionMutations.ts
@@ -0,0 +1,105 @@
+import { ObjectTypeComposer, SchemaComposer } from 'graphql-compose';
+import { get, merge } from 'lodash-es';
+import { CollectionContext, CollectionResolverArgs, EntryNode } from '../types';
+
+export default function addCollectionMutations(
+ schemaComposer: SchemaComposer,
+ args: CollectionResolverArgs
+) {
+ const { name, objectTypeComposer, updateCollectionRecord, collectionEntry } =
+ args;
+
+ async function update(
+ payload: Record,
+ existing: EntryNode
+ ) {
+ // remove _metadata to prevent injection
+ const { _metadata, ...update } = payload?.[name];
+
+ const targetRecord = objectTypeComposer
+ .getResolver('findById')
+ .resolve({ args: update });
+
+ // remove supplied key (might not be required)
+ delete update[targetRecord._metadata.referenceField];
+ const newRecord = merge(targetRecord, update);
+
+ await updateCollectionRecord(collectionEntry, newRecord);
+
+ return newRecord;
+ }
+
+ async function create(source: unknown, payload: Record) {
+ collectionEntry.creationRequiredFields.forEach((field) => {
+ if (!payload[name].hasOwnProperty(field))
+ throw new Error(
+ `field ${field} is required when creating a new ${name}`
+ );
+ });
+
+ const record = merge(payload[name], {
+ _metadata: {
+ referenceField: collectionEntry.referenceField ?? 'id',
+ collection: name,
+ transformedBy: collectionEntry?.defaultTransformer,
+ sourcedBy: collectionEntry?.defaultSource,
+ } as CollectionContext,
+ });
+
+ return await updateCollectionRecord(collectionEntry, record);
+ }
+
+ schemaComposer.Mutation.addFields({
+ [`update${name}`]: {
+ type: objectTypeComposer,
+ args: {
+ [name]: objectTypeComposer
+ .getInputTypeComposer()
+ .makeFieldNonNull(collectionEntry.creationRequiredFields),
+ },
+ description: `Update a ${name}`,
+ async resolve(source: unknown, payload: Record) {
+ const { _metadata, ...args } = payload?.[name];
+
+ const existingRecord = objectTypeComposer
+ .getResolver('findById')
+ .resolve({ args });
+
+ if (!existingRecord)
+ throw new Error(
+ `${name} with ${collectionEntry.referenceField} of ${get(
+ args,
+ collectionEntry.referenceField
+ )} not found`
+ );
+ return update(payload, existingRecord);
+ },
+ },
+ [`create${name}`]: {
+ type: objectTypeComposer,
+ args: {
+ [name]: objectTypeComposer
+ .getInputTypeComposer()
+ .clone(`${name}CreateInput`)
+ .removeField('id')
+ .makeFieldNonNull(collectionEntry.creationRequiredFields),
+ },
+ description: `Create a ${name}`,
+ resolve: create,
+ },
+ [`upsert${name}`]: {
+ type: objectTypeComposer,
+ args: { [name]: objectTypeComposer.getInputTypeComposer() },
+ async resolve(source: unknown, payload: Record) {
+ const { _metadata, ...args } = payload?.[name];
+
+ const existingRecord = objectTypeComposer
+ .getResolver('findById')
+ .resolve({ args });
+
+ if (existingRecord) return update(payload, existingRecord);
+ create(source, payload);
+ },
+ },
+ });
+}
diff --git a/packages/core/src/generators/collectionQueries.ts b/packages/core/src/generators/collectionQueries.ts
new file mode 100644
index 00000000..dd4fa887
--- /dev/null
+++ b/packages/core/src/generators/collectionQueries.ts
@@ -0,0 +1,82 @@
+import resolveQueryArgs from '../resolvers/arguments';
+
+import { SchemaComposer } from 'graphql-compose';
+import { cloneDeep } from 'lodash-es';
+import {
+ generateArgsForAllItemQuery,
+ generateArgsForManyItemQuery,
+ generateArgsForSingleItemQuery,
+} from '../generators/arguments';
+import { CollectionResolverArgs, EntryNode } from '../types';
+
+export default function addCollectionQueries(
+ schemaComposer: SchemaComposer,
+ args: CollectionResolverArgs & { allContentNodesJSON: Record }
+) {
+ const { name, pluralName, config, objectTypeComposer, allContentNodesJSON } =
+ args;
+
+ const pluralTypeQueryName = 'all' + pluralName;
+
+ objectTypeComposer.addResolver({
+ name: 'findById',
+ type: () => objectTypeComposer,
+ description: `Find one ${name} by its ID`,
+ args: generateArgsForSingleItemQuery(),
+ resolve: (rp: Record) =>
+ cloneDeep(
+ allContentNodesJSON[name].find(
+ (node: EntryNode) => node.id === rp.args.id
+ )
+ ),
+ });
+
+ objectTypeComposer.addResolver({
+ name: 'findMany',
+ type: () => [objectTypeComposer],
+ description: `Find many ${pluralName} by their IDs`,
+ args: generateArgsForManyItemQuery(pluralName),
+ resolve: (rp: Record) => {
+ const idsToFind = rp.args.ids ?? [];
+ const matches =
+ cloneDeep(allContentNodesJSON[name])?.filter((node: EntryNode) =>
+ idsToFind?.includes(node.id)
+ ) ?? [];
+ return resolveQueryArgs(matches, rp.args, config, {
+ type: {
+ name: name,
+ pluralName: pluralName,
+ pluralQueryName: pluralTypeQueryName,
+ },
+ });
+ },
+ });
+
+ objectTypeComposer.addResolver({
+ name: 'all',
+ args: generateArgsForAllItemQuery(pluralName),
+ type: () => [objectTypeComposer],
+ description: `Return a set of ${pluralName}`,
+ resolve: (rp: Record) => {
+ const nodes = cloneDeep(allContentNodesJSON[name]);
+ return resolveQueryArgs(nodes, rp.args, config, {
+ type: {
+ name: name,
+ pluralName: pluralName,
+ pluralQueryName: pluralTypeQueryName,
+ },
+ });
+ },
+ });
+
+ schemaComposer.Query.addFields({
+ /**
+ * Add find by ID to each content type
+ */
+ [name]: objectTypeComposer.getResolver('findById'),
+ /**
+ * Add find 'many' to each content type
+ */
+ [pluralTypeQueryName]: objectTypeComposer.getResolver('all'),
+ });
+}
diff --git a/packages/core/src/generators/generateCollection.ts b/packages/core/src/generators/generateCollection.ts
index d939fba9..afd262bd 100644
--- a/packages/core/src/generators/generateCollection.ts
+++ b/packages/core/src/generators/generateCollection.ts
@@ -19,7 +19,7 @@ export function generateCollection({
return transformKeys(
defaultsDeep(
{},
- getFieldOverrides(collection, config),
+ getFieldOverrides(collection, config.content),
...nodes.map((node) => merge({}, node, preknownSchemaFragments))
),
config.fieldNameTransform
diff --git a/packages/core/src/generators/schema.ts b/packages/core/src/generators/schema.ts
index 72dba8a3..1e448a7d 100644
--- a/packages/core/src/generators/schema.ts
+++ b/packages/core/src/generators/schema.ts
@@ -1,28 +1,25 @@
import { schemaComposer } from 'graphql-compose';
import { composeWithJson } from 'graphql-compose-json';
-import { cloneDeep, merge } from 'lodash-es';
+import { defaultsDeep, get, merge, set } from 'lodash-es';
import plur from 'plur';
import { VFile } from 'vfile';
import { cacheSchema, checkCacheForSchema } from '../cache/cache';
+
import {
- generateArgsForAllItemQuery,
- generateArgsForManyItemQuery,
- generateArgsForSingleItemQuery,
-} from '../generators/arguments';
-import resolveQueryArgs from '../resolvers/arguments';
-import {
+ CollectionEntry,
ConfigResult,
EntryNode,
+ LoadedCollectionEntry,
LoadedFlatbreadConfig,
+ Source,
Transformer,
} from '../types';
-import { map } from '../utils/map';
+import { createUniqueId } from '../utils/createUniqueId';
+import { getFieldOverrides } from '../utils/fieldOverrides';
import { generateCollection } from './generateCollection';
-
-interface RootQueries {
- maybeReturnsSingleItem: string[];
- maybeReturnsList: string[];
-}
+import { map } from '../utils/map';
+import addCollectionMutations from './collectionMutations';
+import addCollectionQueries from './collectionQueries';
/**
* Generates a GraphQL schema from content nodes.
@@ -48,7 +45,53 @@ export async function generateSchema(
config.source.initialize?.(config);
// Invoke the content source resolver to retrieve the content nodes
- const allContentNodes = await config.source.fetch(config.content);
+ let allContentNodes: Record = {};
+
+ let collectionEntriesByName = Object.fromEntries(
+ config.content.map((collection: LoadedCollectionEntry) => [
+ collection.name,
+ collection,
+ ])
+ );
+
+ const addRecord =
+ (sourceId: string) =>
+ (
+ collection: LoadedCollectionEntry,
+ record: EntryNode,
+ context: Ctx
+ ) => {
+ allContentNodes[collection.name] = allContentNodes[collection.name] ?? [];
+
+ const newRecord = {
+ record,
+ context: {
+ sourceContext: context,
+ sourcedBy: sourceId,
+ collection: collection.name,
+ referenceField: collection.referenceField ?? 'id',
+ },
+ };
+
+ allContentNodes[collection.name].push(newRecord);
+ return newRecord;
+ };
+
+ function addCreationRequiredFields(
+ collection: CollectionEntry,
+ fields: string[]
+ ): void {
+ if (!collectionEntriesByName[collection.name])
+ throw new Error(`Couldn't find collection ${collection.name}`);
+ collectionEntriesByName?.[collection.name]?.creationRequiredFields?.push(
+ ...fields
+ );
+ }
+
+ await config.source.fetch(config.content, {
+ addRecord: addRecord(config.source.id as string),
+ addCreationRequiredFields,
+ });
// Transform the content nodes to the expected JSON format if needed
const allContentNodesJSON = optionallyTransformContentNodes(
@@ -80,28 +123,65 @@ export async function generateSchema(
])
);
- /**
- * @todo potentially able to remove this
- **/
- let queries: RootQueries = {
- maybeReturnsSingleItem: [],
- maybeReturnsList: [],
+ const transformersById = {
+ ...Object.fromEntries(
+ config.transformer.map((transformer) => [transformer.id, transformer])
+ ),
+ // this will be the default for collections that aren't already `transformedBy` anything
+ undefined: config.transformer[0],
};
+ async function updateCollectionRecord(
+ collection: CollectionEntry,
+ entry: EntryNode & { _metadata: any }
+ ) {
+ const ctx = entry._metadata;
+ const {
+ serialize,
+ extensions,
+ id: transformerId,
+ } = transformersById[ctx.transformedBy];
+
+ if (ctx.reference) {
+ const index = allContentNodesJSON[ctx.collection].findIndex(
+ (c) => get(c, ctx.referenceField) === ctx.reference
+ );
+
+ if (index < 0) throw new Error('Failed to find record to update');
+ // replace in memory representation of record
+ allContentNodesJSON[ctx.collection][index] = entry;
+ } else {
+ entry._metadata.reference = createUniqueId();
+ set(entry, entry._metadata.referenceField, entry._metadata.reference);
+ entry._metadata.transformedBy = transformerId;
+ entry._metadata.extension = extensions?.[0];
+ allContentNodesJSON[ctx.collection].push(entry);
+ }
+
+ const { _metadata, ...record } = entry;
+ const file = await serialize(record, ctx.transformContext);
+ await config?.source.put(file, ctx.sourceContext, {
+ parentContext: ctx,
+ collection,
+ record,
+ });
+
+ return entry;
+ }
+
// Main builder loop - iterate through each content type and generate query resolvers + relationships for it
- for (const [type, schema] of Object.entries(schemaArray)) {
- const pluralType = plur(type, 2);
- const pluralTypeQueryName = 'all' + pluralType;
+ for (const [name, objectTypeComposer] of Object.entries(schemaArray)) {
+ const pluralName = plur(name, 2);
//
/// Global meta fields
//
- schema.addFields({
+ objectTypeComposer.addFields({
_collection: {
type: 'String',
description: 'The collection name',
- resolve: () => type,
+ resolve: () => name,
},
});
@@ -109,77 +189,46 @@ export async function generateSchema(
/// Query resolvers
//
- schema.addResolver({
- name: 'findById',
- type: () => schema,
- description: `Find one ${type} by its ID`,
- args: generateArgsForSingleItemQuery(),
- resolve: (rp: Record) =>
- cloneDeep(allContentNodesJSON[type]).find(
- (node: EntryNode) => node.id === rp.args.id
- ),
- });
+ // TODO: add a new type of plugin that can add resolvers to each collection, they should be called here
- schema.addResolver({
- name: 'findMany',
- type: () => [schema],
- description: `Find many ${pluralType} by their IDs`,
- args: generateArgsForManyItemQuery(pluralType),
- resolve: (rp: Record) => {
- const idsToFind = rp.args.ids ?? [];
- const matches =
- cloneDeep(allContentNodesJSON[type])?.filter((node: EntryNode) =>
- idsToFind?.includes(node.id)
- ) ?? [];
- return resolveQueryArgs(matches, rp.args, config, {
- type: {
- name: type,
- pluralName: pluralType,
- pluralQueryName: pluralTypeQueryName,
- },
- });
- },
- });
+ const collectionEntry = collectionEntriesByName[name];
- schema.addResolver({
- name: 'all',
- args: generateArgsForAllItemQuery(pluralType),
- type: () => [schema],
- description: `Return a set of ${pluralType}`,
- resolve: (rp: Record) => {
- const nodes = cloneDeep(allContentNodesJSON[type]);
- return resolveQueryArgs(nodes, rp.args, config, {
- type: {
- name: type,
- pluralName: pluralType,
- pluralQueryName: pluralTypeQueryName,
- },
- });
- },
+ addCollectionQueries(schemaComposer, {
+ name,
+ pluralName,
+ allContentNodesJSON,
+ updateCollectionRecord,
+ objectTypeComposer,
+ config,
+ collectionEntry,
});
- schemaComposer.Query.addFields({
- /**
- * Add find by ID to each content type
- */
- [type]: schema.getResolver('findById'),
- /**
- * Add find 'many' to each content type
- */
- [pluralTypeQueryName]: schema.getResolver('all'),
+ addCollectionMutations(schemaComposer, {
+ name,
+ pluralName,
+ objectTypeComposer,
+ updateCollectionRecord,
+ config,
+ collectionEntry,
});
- /**
- * Separate the queries by return type for later use when wrapping the query resolvers
- * @todo potentially able to remove this
- **/
- queries.maybeReturnsSingleItem.push(type);
- queries.maybeReturnsList.push(pluralTypeQueryName);
+ await Promise.all(
+ config.collectionResolvers.map((collectionResolver) =>
+ collectionResolver(schemaComposer, {
+ name,
+ pluralName,
+ objectTypeComposer,
+ updateCollectionRecord,
+ config,
+ collectionEntry,
+ })
+ )
+ );
}
// Create map of references on each content node
- for (const { collection, refs } of config.content) {
- const typeTC = schemaComposer.getOTC(collection);
+ for (const { name, refs } of config.content) {
+ const typeTC = schemaComposer.getOTC(name);
if (!refs) continue;
@@ -196,7 +245,7 @@ export async function generateSchema(
description: `All ${plur(
String(refType),
2
- )} that are referenced by this ${collection}`,
+ )} that are referenced by this ${name}`,
resolver: () => refTypeTC.getResolver('findMany'),
prepareArgs: {
ids: (source) => source[refField],
@@ -206,7 +255,7 @@ export async function generateSchema(
} else {
// If the reference field has a single node
typeTC.addRelation(refField, {
- description: `The ${refType} referenced by this ${collection}`,
+ description: `The ${refType} referenced by this ${name}`,
resolver: () => refTypeTC.getResolver('findById'),
prepareArgs: {
id: (source) => source[refField],
@@ -242,11 +291,9 @@ const fetchPreknownSchemaFragments = (
function getTransformerExtensionMap(transformer: Transformer[]) {
const transformerMap = new Map();
- transformer.forEach((t) => {
- t.extensions.forEach((extension) => {
- transformerMap.set(extension, t);
- });
- });
+ transformer.forEach((t) =>
+ t.extensions.forEach((extension) => transformerMap.set(extension, t))
+ );
return transformerMap;
}
@@ -272,14 +319,20 @@ const optionallyTransformContentNodes = (
* @todo if this becomes a performance bottleneck, consider overloading the source plugin API to accept a transform function so we can avoid mapping through the content nodes twice
* */
- return map(allContentNodes, (node: VFile) => {
- const transformer = transformerMap.get(node.extname);
+ return map(allContentNodes, (node: { record: VFile; context: any }) => {
+ const transformer = transformerMap.get(node.record.extname);
if (!transformer?.parse) {
- throw new Error(`no transformer found for ${node.path}`);
+ throw new Error(`no transformer found for ${node.record.path}`);
}
- return transformer.parse(node);
+ const { record: doc, context } = transformer.parse(node.record);
+ doc._metadata = node.context;
+ doc._metadata.transformedBy = transformer.id;
+ doc._metadata.transformContext = context;
+ doc._metadata.reference = get(doc, node.context.referenceField);
+ return doc;
});
}
+ // TODO: might need to map this to attach metadata here
return allContentNodes;
};
diff --git a/packages/core/src/providers/test/base.test.ts b/packages/core/src/providers/test/base.test.ts
index 145c2f45..0ca5ff82 100644
--- a/packages/core/src/providers/test/base.test.ts
+++ b/packages/core/src/providers/test/base.test.ts
@@ -1,11 +1,15 @@
-import test from 'ava';
-import filesystem from '@flatbread/source-filesystem';
import markdownTransformer from '@flatbread/transformer-markdown';
+import test from 'ava';
+import { SourceVirtual } from '../../sources/virtual';
import { FlatbreadProvider } from '../base';
+import { mockData } from './mockData';
+import { CollectionResolverArgs } from '../../types';
+
+const sourceVirtual = new SourceVirtual(mockData);
function basicProject() {
return new FlatbreadProvider({
- source: filesystem(),
+ source: sourceVirtual,
transformer: markdownTransformer({
markdown: {
gfm: true,
@@ -16,7 +20,7 @@ function basicProject() {
content: [
{
path: 'examples/content/markdown/authors',
- collection: 'Author',
+ name: 'Author',
refs: {
friend: 'Author',
},
@@ -25,6 +29,47 @@ function basicProject() {
});
}
+test('create custom collection resolver', async (t) => {
+ const flatbread = await new FlatbreadProvider({
+ source: sourceVirtual,
+ transformer: markdownTransformer({
+ markdown: {
+ gfm: true,
+ externalLinks: true,
+ },
+ }),
+
+ collectionResolvers: [
+ function fakeResolver(schemaComposer, args) {
+ const { name } = args;
+
+ schemaComposer.Query.addFields({
+ [`fake${name}`]: {
+ type: 'String',
+ description: `fake resolver`,
+ resolve() {
+ return `fake ${name}!`;
+ },
+ },
+ });
+ },
+ ],
+
+ content: [
+ {
+ path: 'examples/content/markdown/authors',
+ name: 'Author',
+ refs: {
+ friend: 'Author',
+ },
+ },
+ ],
+ });
+
+ const result: any = await flatbread.query({ source: `{ fakeAuthor }` });
+ t.is(result.data.fakeAuthor, 'fake Author!');
+});
+
test('basic query', async (t) => {
const flatbread = basicProject();
@@ -48,7 +93,7 @@ test('relational filter query', async (t) => {
const result = await flatbread.query({
source: `
query AllAuthors {
- allAuthors(filter: {friend: {name: {eq: "Eva"}}}) {
+ allAuthors(filter: {friend: {name: {wildcard: "Ev*"}}}) {
name
enjoys
}
@@ -58,3 +103,74 @@ test('relational filter query', async (t) => {
t.snapshot(result);
});
+
+test('update collection record', async (t) => {
+ const flatbread = basicProject();
+ const sitting = (Math.random() * 100) | 0;
+ const result: any = await flatbread.query({
+ variableValues: { author: { id: '2a3e', skills: { sitting } } },
+ source: `
+ mutation UpdateAuthor($author: AuthorInput){
+ updateAuthor(Author: $author) {
+ id
+ skills {
+ sitting
+ }
+ }
+ }
+ `,
+ });
+
+ t.is(result.data.updateAuthor.skills.sitting, sitting);
+
+ const updated: any = await flatbread.query({
+ source: `
+ query {
+ Author(id: "2a3e") {
+ id
+ skills {
+ sitting
+ }
+ }
+ }
+ `,
+ });
+
+ t.is(updated.data.Author.skills.sitting, sitting);
+});
+
+test('create collection record', async (t) => {
+ const flatbread = basicProject();
+ const sitting = 69;
+ const result: any = await flatbread.query({
+ variableValues: { test: { skills: { sitting } } },
+ source: `
+ mutation CreateAuthor($test: AuthorCreateInput){
+ createAuthor(Author: $test) {
+ id
+ skills {
+ sitting
+ }
+ }
+ }
+ `,
+ });
+
+ t.is(result.data.createAuthor.skills.sitting, sitting);
+
+ const updated: any = await flatbread.query({
+ variableValues: { id: result.data.createAuthor.id },
+ source: `
+ query QueryAuthor($id: String) {
+ Author(id: $id) {
+ id
+ skills {
+ sitting
+ }
+ }
+ }
+ `,
+ });
+
+ t.is(updated.data.Author.skills.sitting, sitting);
+});
diff --git a/packages/core/src/providers/test/mockData.ts b/packages/core/src/providers/test/mockData.ts
new file mode 100644
index 00000000..44180443
--- /dev/null
+++ b/packages/core/src/providers/test/mockData.ts
@@ -0,0 +1,75 @@
+import { VFile } from 'vfile';
+
+export const mockData = {
+ Author: [
+ new VFile({
+ path: '/content/authors/eva.md',
+ extname: '.md',
+ value: `---
+ id: 40s3
+ name: Eva
+ entity: Cat
+ enjoys:
+ - sitting
+ - standing
+ - mow mow
+ - sleepy time
+ - attention
+ friend: 2a3e
+ image: eva.svg
+ date_joined: 2002-02-25T16:41:59.558Z
+ skills:
+ sitting: 100000
+ breathing: 4.7
+ liquid_consumption: 10
+ existence: funky
+ sports: -200
+---
+ `,
+ }),
+ new VFile({
+ path: '/content/authors/tony.md',
+ extname: '.md',
+ value: `---
+ name: Tony
+ id: 2a3e
+ friend: ab2c
+ enjoys:
+ - cats
+ - tea
+ - making this
+ date_joined: 2021-02-25T16:41:59.558Z
+ skills:
+ sitting: 71
+ breathing: 7.07
+ liquid_consumption: 100
+ existence: simulation
+ sports: -2
+ cat_pat: 1500
+---
+ `,
+ }),
+ new VFile({
+ path: '/content/authors/daes.md',
+ extname: '.md',
+ value: `---
+ id: ab2c
+ name: Daes
+ entity: Human
+ enjoys:
+ - cats
+ - coffee
+ - design
+ friend: 40s3
+ date_joined: 2021-04-22T16:41:59.558Z
+ skills:
+ sitting: 304
+ breathing: 1.034234
+ liquid_consumption: -100
+ existence: etheral
+ sports: 3
+---
+ `,
+ }),
+ ],
+};
diff --git a/packages/core/src/providers/test/snapshots/base.test.ts.md b/packages/core/src/providers/test/snapshots/base.test.ts.md
index 8229fe4a..74f150ee 100644
--- a/packages/core/src/providers/test/snapshots/base.test.ts.md
+++ b/packages/core/src/providers/test/snapshots/base.test.ts.md
@@ -13,21 +13,9 @@ Generated by [AVA](https://avajs.dev).
allAuthors: [
{
enjoys: [
- 'cats',
- 'coffee',
- 'design',
- ],
- name: 'Daes',
- },
- {
- enjoys: [
- 'sitting',
- 'standing',
- 'mow mow',
- 'sleepy time',
- 'attention',
+ 'apples',
],
- name: 'Eva',
+ name: 'Another User',
},
{
enjoys: [
@@ -37,23 +25,6 @@ Generated by [AVA](https://avajs.dev).
],
name: 'Tony',
},
- {
- enjoys: [
- 'peeing in the cat tower',
- 'being shaped like an egg',
- 'violence',
- ],
- name: 'Ushi',
- },
- {
- enjoys: [
- 'talking',
- 'encroaching upon personal space',
- 'being concerned',
- 'smooth jazz',
- ],
- name: 'Yoshi',
- },
],
},
}
@@ -65,21 +36,13 @@ Generated by [AVA](https://avajs.dev).
{
data: {
allAuthors: [
- {
- enjoys: [
- 'cats',
- 'coffee',
- 'design',
- ],
- name: 'Daes',
- },
{
enjoys: [
'cats',
'tea',
'making this',
],
- name: 'Tony',
+ name: 'Daes',
},
],
},
diff --git a/packages/core/src/providers/test/snapshots/base.test.ts.snap b/packages/core/src/providers/test/snapshots/base.test.ts.snap
index 7b8489be..61d815b0 100644
Binary files a/packages/core/src/providers/test/snapshots/base.test.ts.snap and b/packages/core/src/providers/test/snapshots/base.test.ts.snap differ
diff --git a/packages/core/src/sources/virtual.ts b/packages/core/src/sources/virtual.ts
new file mode 100644
index 00000000..d2be745a
--- /dev/null
+++ b/packages/core/src/sources/virtual.ts
@@ -0,0 +1,55 @@
+import { cloneDeep } from 'lodash-es';
+import { VFile } from 'vfile';
+import {
+ FlatbreadArgs,
+ LoadedCollectionEntry,
+ LoadedFlatbreadConfig,
+ Source,
+} from '../types';
+
+interface MemContext {
+ id: string;
+ collectionName: string;
+}
+
+export class SourceVirtual implements Source {
+ private data: Record = {};
+
+ public id = '@flatbread/sourceMemory';
+
+ constructor(data: Record) {
+ this.data = data;
+ }
+
+ initialize(config: LoadedFlatbreadConfig) {}
+
+ async fetch(
+ entries: LoadedCollectionEntry[],
+ { addRecord }: FlatbreadArgs
+ ) {
+ for (const entry of entries) {
+ if (!this.data[entry.name])
+ throw new Error(`can't find collection ${entry.name}`);
+ for (const record of this.data[entry.name]) {
+ addRecord(entry, cloneDeep(record), {
+ id: record.path,
+ collectionName: entry.name,
+ });
+ }
+ }
+ }
+
+ async put(doc: VFile, context: MemContext, { parentContext }: any) {
+ const record = this.data[parentContext.collection].find(
+ (entry) => entry.path === parentContext.reference
+ );
+
+ if (record) {
+ record.value = doc.value;
+ } else {
+ this.data[parentContext.collection].push(doc);
+ }
+
+ return { doc, context };
+ }
+}
diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts
index 39237b2e..336bde15 100644
--- a/packages/core/src/types.ts
+++ b/packages/core/src/types.ts
@@ -1,4 +1,5 @@
import { GraphQLFieldConfigArgumentMap, GraphQLInputType } from 'graphql';
+import { ObjectTypeComposer, SchemaComposer } from 'graphql-compose';
import { Maybe } from 'graphql/jsutils/Maybe';
import type { VFile } from 'vfile';
@@ -21,16 +22,35 @@ export type ContentNode = BaseContentNode & {
* @todo This needs to be typed more strictly.
*/
export interface FlatbreadConfig {
- source: Source;
+ source: Source;
transformer?: Transformer | Transformer[];
- content: Content;
+ content: CollectionEntry[];
fieldNameTransform?: (field: string) => string;
+ collectionResolvers?: CollectionResolver[];
}
+export interface CollectionResolverArgs {
+ name: string;
+ pluralName: string;
+ config: LoadedFlatbreadConfig;
+ objectTypeComposer: ObjectTypeComposer;
+ collectionEntry: LoadedCollectionEntry;
+ updateCollectionRecord: (
+ collection: CollectionEntry,
+ entry: EntryNode & { _metadata: CollectionContext }
+ ) => Promise;
+}
+
+export type CollectionResolver = (
+ schemaComposer: SchemaComposer,
+ args: CollectionResolverArgs
+) => void | Promise;
+
export interface LoadedFlatbreadConfig {
- source: Source;
+ source: Source;
transformer: Transformer[];
- content: Content;
+ content: LoadedCollectionEntry[];
+ collectionResolvers: CollectionResolver[];
fieldNameTransform: (field: string) => string;
loaded: {
extensions: string[];
@@ -53,8 +73,10 @@ export interface Transformer {
* @param input Node to transform
*/
parse?: (input: VFile) => EntryNode;
+ id?: string;
preknownSchemaFragments?: () => Record;
inspect: (input: EntryNode) => string;
+ serialize: (input: EntryNode, ctx: CollectionContext) => VFile;
extensions: string[];
}
@@ -69,15 +91,36 @@ export type EntryNode = Record;
* The result of an invoked `Source` plugin which contains methods on how to retrieve content nodes in
* their raw (if coupled with a `Transformer` plugin) or processed form.
*/
-export interface Source {
+
+export interface FlatbreadArgs {
+ addRecord(
+ collection: LoadedCollectionEntry,
+ record: EntryNode,
+ context?: Context
+ ): void;
+ addCreationRequiredFields(
+ collection: LoadedCollectionEntry,
+ fields: string[]
+ ): void;
+}
+
+export interface Source {
initialize?: (flatbreadConfig: LoadedFlatbreadConfig) => void;
- fetchByType?: (path: string) => Promise;
+ id?: string;
+ put: (
+ source: VFile,
+ ctx: Context,
+ opts: { parentContext: any; collection: CollectionEntry; record: any }
+ ) => Promise<{ doc: VFile; context: Context }>;
fetch: (
- allContentTypes: Record[]
- ) => Promise>;
+ allContentTypes: LoadedCollectionEntry[],
+ flatbread: FlatbreadArgs
+ ) => Promise;
}
-export type SourcePlugin = (sourceConfig?: Record) => Source;
+export type SourcePlugin = (
+ sourceConfig?: Record
+) => Source;
/**
* An override can be used to declare a custom resolve for a field in content
@@ -94,13 +137,35 @@ export interface Override {
) => any;
}
+export interface CollectionContext {
+ referenceField: string;
+ collection: string;
+ filename: string;
+ path: string;
+ slug: string;
+ sourcedBy: string;
+ transformedBy: string;
+ reference: string;
+}
+
/**
- * An array of content descriptions which can be used to retrieve content nodes.
+ * A collection entry which can be used to retrieve content nodes.
*
* This is paired with a `Source` (and, *optionally*, a `Transformer`) plugin.
*/
-export type Content = {
- collection: string;
+
+export interface CollectionEntry {
+ name: string;
+ path: string;
overrides?: Override[];
- [key: string]: any;
-}[];
+ refs?: Record;
+ referenceField?: string;
+ creationRequiredFields?: string[];
+ defaultTransformer?: string;
+ defaultSource?: string;
+}
+
+export interface LoadedCollectionEntry extends CollectionEntry {
+ referenceField: string;
+ creationRequiredFields: string[];
+}
diff --git a/packages/core/src/utils/createShaHash.ts b/packages/core/src/utils/createShaHash.ts
new file mode 100644
index 00000000..a194072a
--- /dev/null
+++ b/packages/core/src/utils/createShaHash.ts
@@ -0,0 +1,6 @@
+import { anyToString } from './stringUtils';
+import { createHash } from 'crypto';
+
+export default function createShaHash(content: any) {
+ return createHash('sha256').update(anyToString(content)).digest('hex');
+}
diff --git a/packages/core/src/utils/createUniqueId.ts b/packages/core/src/utils/createUniqueId.ts
new file mode 100644
index 00000000..c860ed01
--- /dev/null
+++ b/packages/core/src/utils/createUniqueId.ts
@@ -0,0 +1,8 @@
+import { customAlphabet } from 'nanoid';
+
+// only use lower case letters and numbers to avoid issues with windows ignoring case on filenames
+const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz0123456789');
+
+export function createUniqueId() {
+ return nanoid();
+}
diff --git a/packages/core/src/utils/fieldOverrides.ts b/packages/core/src/utils/fieldOverrides.ts
index f3106bb9..5122ea14 100644
--- a/packages/core/src/utils/fieldOverrides.ts
+++ b/packages/core/src/utils/fieldOverrides.ts
@@ -1,20 +1,24 @@
-import { FlatbreadConfig, Override } from '../types';
import { get, set } from 'lodash-es';
+import { CollectionEntry } from '../../dist';
+import { Override } from '../types';
/**
* Get an object containing functions nested in an object structure
* aligning to the listed overrides in the config
*
- * @param collection the collection string referenced in the config
- * @param config the flatbread config object
+ * @param collectionName the collection string referenced in the config
+ * @param entries the flatbread config object
* @returns an object in the shape of the json schema
*/
-export function getFieldOverrides(collection: string, config: FlatbreadConfig) {
- const content = config.content.find(
- (content) => content.collection === collection
+export function getFieldOverrides(
+ collectionName: string,
+ entries: CollectionEntry[]
+) {
+ const collectionEntry = entries.find(
+ (entry) => entry.name === collectionName
);
- if (!content?.overrides) return {};
- const overrides = content.overrides;
+ if (!collectionEntry?.overrides) return {};
+ const overrides = collectionEntry.overrides;
return overrides.reduce((fields: any, override: Override) => {
const { field, type, ...rest } = override;
diff --git a/packages/core/src/utils/initializeConfig.ts b/packages/core/src/utils/initializeConfig.ts
index 8513e310..d569711b 100644
--- a/packages/core/src/utils/initializeConfig.ts
+++ b/packages/core/src/utils/initializeConfig.ts
@@ -1,6 +1,9 @@
-import { cloneDeep } from 'lodash-es';
+import { cloneDeep, defaultsDeep } from 'lodash-es';
+import { LoadedCollectionEntry } from '../types';
import { FlatbreadConfig, LoadedFlatbreadConfig, Transformer } from '../types';
import { toArray } from './arrayUtils';
+import createShaHash from './createShaHash';
+import { anyToString } from './stringUtils';
import camelCase from './camelCase';
/**
@@ -10,11 +13,23 @@ export function initializeConfig(
rawConfig: FlatbreadConfig
): LoadedFlatbreadConfig {
const config = cloneDeep(rawConfig);
- const transformer = toArray(config.transformer ?? []);
+ const transformer = toArray(config.transformer ?? []).map((t) => {
+ t.id = t.id ?? createShaHash(t);
+ return t;
+ });
+
+ config.source.id = config.source.id ?? createShaHash(config.source);
return {
fieldNameTransform: camelCase,
...config,
+ collectionResolvers: config.collectionResolvers || [],
+ content: config.content?.map((content: Partial) =>
+ defaultsDeep(content, {
+ referenceField: 'id',
+ creationRequiredFields: [],
+ })
+ ),
transformer,
loaded: {
extensions: transformer
diff --git a/packages/core/src/utils/tests/fieldOverrides.test.ts b/packages/core/src/utils/tests/fieldOverrides.test.ts
index fca200ee..bb93fdf7 100644
--- a/packages/core/src/utils/tests/fieldOverrides.test.ts
+++ b/packages/core/src/utils/tests/fieldOverrides.test.ts
@@ -1,8 +1,9 @@
import test from 'ava';
+import { LoadedCollectionEntry } from '../../types';
import { getFieldOverrides } from '../fieldOverrides.js';
-function getProps(overrides: any[]): [string, any] {
- return ['t', { content: [{ collection: 't', overrides }] }];
+function getProps(overrides: any[]): [string, LoadedCollectionEntry[]] {
+ return ['t', [{ name: 't', overrides, referenceField: 'id' }]];
}
test('basic override', (t) => {
diff --git a/packages/editor/.eslintignore b/packages/editor/.eslintignore
new file mode 100644
index 00000000..38972655
--- /dev/null
+++ b/packages/editor/.eslintignore
@@ -0,0 +1,13 @@
+.DS_Store
+node_modules
+/build
+/.svelte-kit
+/package
+.env
+.env.*
+!.env.example
+
+# Ignore files for PNPM, NPM and YARN
+pnpm-lock.yaml
+package-lock.json
+yarn.lock
diff --git a/packages/editor/.eslintrc.cjs b/packages/editor/.eslintrc.cjs
new file mode 100644
index 00000000..3ccf435f
--- /dev/null
+++ b/packages/editor/.eslintrc.cjs
@@ -0,0 +1,20 @@
+module.exports = {
+ root: true,
+ parser: '@typescript-eslint/parser',
+ extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'],
+ plugins: ['svelte3', '@typescript-eslint'],
+ ignorePatterns: ['*.cjs'],
+ overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }],
+ settings: {
+ 'svelte3/typescript': () => require('typescript')
+ },
+ parserOptions: {
+ sourceType: 'module',
+ ecmaVersion: 2020
+ },
+ env: {
+ browser: true,
+ es2017: true,
+ node: true
+ }
+};
diff --git a/packages/editor/.flatbread/schemas/author.yaml b/packages/editor/.flatbread/schemas/author.yaml
new file mode 100644
index 00000000..82f623ea
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author.yaml
@@ -0,0 +1,53 @@
+name: Author
+kind: OBJECT
+fields:
+ - label: Name
+ name: name
+ component: string
+ - label: Date joined
+ name: date_joined
+ component: date
+ - label: Entity
+ name: entity
+ component: string
+ - label: Enjoys
+ name: enjoys
+ component: list
+ - label: Friend
+ name: friend
+ description: The Author referenced by this Author
+ component: object
+ collection: Author
+ - label: Image
+ name: image
+ component: svimg
+ collection: Svimg
+ - label: Skills
+ name: skills
+ component: object
+ collection: Author_Skills
+ - label: Collection
+ name: _collection
+ description: The collection name
+ disabled: true
+ component: string
+ - label: Id
+ name: id
+ disabled: true
+ component: string
+ - label: Content
+ name: _content
+ disabled: true
+ component: object
+ collection: Author__content
+ - label: Metadata
+ name: _metadata
+ disabled: true
+ component: object
+ collection: Author__metadata
+component: object
+label: Author
+pluralName: Authors
+referenceField: name
+meta:
+ hash: wJ/UxraDtoG3TPy2ZtymmKmFHJA=
diff --git a/packages/editor/.flatbread/schemas/author_-skills.yaml b/packages/editor/.flatbread/schemas/author_-skills.yaml
new file mode 100644
index 00000000..0ac94631
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author_-skills.yaml
@@ -0,0 +1,23 @@
+name: Author_Skills
+kind: OBJECT
+fields:
+ - label: Breathing
+ name: breathing
+ component: float
+ - label: Existence
+ name: existence
+ component: string
+ - label: Liquid consumption
+ name: liquid_consumption
+ component: float
+ - label: Sitting
+ name: sitting
+ component: float
+ - label: Sports
+ name: sports
+ component: float
+component: object
+label: Author_ Skills
+referenceField: id
+meta:
+ hash: Blv5+KF1qwWNDdU3K6uCT40U6HU=
diff --git a/packages/editor/.flatbread/schemas/author__content.yaml b/packages/editor/.flatbread/schemas/author__content.yaml
new file mode 100644
index 00000000..71bee953
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author__content.yaml
@@ -0,0 +1,23 @@
+name: Author__content
+kind: OBJECT
+fields:
+ - label: Excerpt
+ name: excerpt
+ description: A plaintext excerpt taken from the main content
+ component: string
+ - label: Html
+ name: html
+ description: The content as HTML
+ component: string
+ - label: Raw
+ name: raw
+ component: string
+ - label: Timetoread
+ name: timeToRead
+ description: How long (in minutes) it would take an average reader to read the main content.
+ component: int
+component: object
+label: Author__content
+referenceField: id
+meta:
+ hash: 8+fJdGTuCY8ij7xoqxZI8xCos80=
diff --git a/packages/editor/.flatbread/schemas/author__metadata.yaml b/packages/editor/.flatbread/schemas/author__metadata.yaml
new file mode 100644
index 00000000..2e6fa2b0
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author__metadata.yaml
@@ -0,0 +1,30 @@
+name: Author__metadata
+kind: OBJECT
+fields:
+ - label: Collection
+ name: collection
+ component: string
+ - label: Reference
+ name: reference
+ component: string
+ - label: Referencefield
+ name: referenceField
+ component: string
+ - label: Sourcedby
+ name: sourcedBy
+ component: string
+ - label: Transformcontext
+ name: transformContext
+ component: json
+ - label: Transformedby
+ name: transformedBy
+ component: string
+ - label: Sourcecontext
+ name: sourceContext
+ component: object
+ collection: Author__metadata_SourceContext
+component: object
+label: Author__metadata
+referenceField: id
+meta:
+ hash: wy+YFVDu46TK+9c6m4ysZq+xhUU=
diff --git a/packages/editor/.flatbread/schemas/author__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/author__metadata_-source-context.yaml
new file mode 100644
index 00000000..74798173
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/author__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: Author__metadata_SourceContext
+kind: OBJECT
+fields:
+ - label: Filename
+ name: filename
+ component: string
+ - label: Path
+ name: path
+ component: string
+ - label: Slug
+ name: slug
+ component: string
+component: object
+label: Author__metadata_ Source Context
+referenceField: id
+meta:
+ hash: gSsmwSPcdxtWn3jegimd00XqCo8=
diff --git a/packages/editor/.flatbread/schemas/mutation.yaml b/packages/editor/.flatbread/schemas/mutation.yaml
new file mode 100644
index 00000000..72a0f93f
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/mutation.yaml
@@ -0,0 +1,78 @@
+name: Mutation
+kind: OBJECT
+fields:
+ - label: Createauthor
+ name: createAuthor
+ description: Create a Author
+ component: object
+ collection: Author
+ - label: Createoverridetest
+ name: createOverrideTest
+ description: Create a OverrideTest
+ component: object
+ collection: OverrideTest
+ - label: Createpost
+ name: createPost
+ description: Create a Post
+ component: object
+ collection: Post
+ - label: Createpostcategory
+ name: createPostCategory
+ description: Create a PostCategory
+ component: object
+ collection: PostCategory
+ - label: Createyamlauthor
+ name: createYamlAuthor
+ description: Create a YamlAuthor
+ component: object
+ collection: YamlAuthor
+ - label: Updateauthor
+ name: updateAuthor
+ description: Update a Author
+ component: object
+ collection: Author
+ - label: Updateoverridetest
+ name: updateOverrideTest
+ description: Update a OverrideTest
+ component: object
+ collection: OverrideTest
+ - label: Updatepost
+ name: updatePost
+ description: Update a Post
+ component: object
+ collection: Post
+ - label: Updatepostcategory
+ name: updatePostCategory
+ description: Update a PostCategory
+ component: object
+ collection: PostCategory
+ - label: Updateyamlauthor
+ name: updateYamlAuthor
+ description: Update a YamlAuthor
+ component: object
+ collection: YamlAuthor
+ - label: Upsertauthor
+ name: upsertAuthor
+ component: object
+ collection: Author
+ - label: Upsertoverridetest
+ name: upsertOverrideTest
+ component: object
+ collection: OverrideTest
+ - label: Upsertpost
+ name: upsertPost
+ component: object
+ collection: Post
+ - label: Upsertpostcategory
+ name: upsertPostCategory
+ component: object
+ collection: PostCategory
+ - label: Upsertyamlauthor
+ name: upsertYamlAuthor
+ component: object
+ collection: YamlAuthor
+component: object
+label: Mutation
+referenceField: id
+meta:
+ hash: NhJ1i1yQcPoJu/n0bLd/kDItWXs=
diff --git a/packages/editor/.flatbread/schemas/override-test.yaml b/packages/editor/.flatbread/schemas/override-test.yaml
new file mode 100644
index 00000000..2f1bb080
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test.yaml
@@ -0,0 +1,44 @@
+name: OverrideTest
+kind: OBJECT
+fields:
+ - label: Title
+ name: title
+ component: string
+ - label: Array
+ name: array
+ component: list
+ - label: Array2
+ name: array2
+ component: list
+ - label: Array3
+ name: array3
+ component: list
+ - label: Deeply
+ name: deeply
+ component: object
+ collection: OverrideTest_Deeply
+ - label: Collection
+ name: _collection
+ description: The collection name
+ disabled: true
+ component: string
+ - label: Id
+ name: id
+ disabled: true
+ component: string
+ - label: Content
+ name: _content
+ disabled: true
+ component: object
+ collection: OverrideTest__content
+ - label: Metadata
+ name: _metadata
+ disabled: true
+ component: object
+ collection: OverrideTest__metadata
+component: object
+label: Override Test
+pluralName: Override Tests
+referenceField: title
+meta:
+ hash: J7yZu464rDAR0+xgyPOQKdKdRH0=
diff --git a/packages/editor/.flatbread/schemas/override-test_-array2.yaml b/packages/editor/.flatbread/schemas/override-test_-array2.yaml
new file mode 100644
index 00000000..d0dd0707
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-array2.yaml
@@ -0,0 +1,11 @@
+name: OverrideTest_Array2
+kind: OBJECT
+fields:
+ - label: Obj
+ name: obj
+ component: string
+component: object
+label: Override Test_ Array2
+referenceField: id
+meta:
+ hash: qKSJky1zrZ5je3dtuAaQug5kAeE=
diff --git a/packages/editor/.flatbread/schemas/override-test_-array3.yaml b/packages/editor/.flatbread/schemas/override-test_-array3.yaml
new file mode 100644
index 00000000..68076539
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-array3.yaml
@@ -0,0 +1,12 @@
+name: OverrideTest_Array3
+kind: OBJECT
+fields:
+ - label: Obj
+ name: obj
+ component: object
+ collection: OverrideTest_Array3_Obj
+component: object
+label: Override Test_ Array3
+referenceField: id
+meta:
+ hash: 34791d5i8uHnVwwh6lXB/MVzq4I=
diff --git a/packages/editor/.flatbread/schemas/override-test_-array3_-obj.yaml b/packages/editor/.flatbread/schemas/override-test_-array3_-obj.yaml
new file mode 100644
index 00000000..d3f89a4c
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-array3_-obj.yaml
@@ -0,0 +1,11 @@
+name: OverrideTest_Array3_Obj
+kind: OBJECT
+fields:
+ - label: Test
+ name: test
+ component: string
+component: object
+label: Override Test_ Array3_ Obj
+referenceField: id
+meta:
+ hash: 7OMtizm7p4QC4GG9n5dL+L/uiM0=
diff --git a/packages/editor/.flatbread/schemas/override-test_-deeply.yaml b/packages/editor/.flatbread/schemas/override-test_-deeply.yaml
new file mode 100644
index 00000000..4ce06f18
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test_-deeply.yaml
@@ -0,0 +1,11 @@
+name: OverrideTest_Deeply
+kind: OBJECT
+fields:
+ - label: Nested
+ name: nested
+ component: string
+component: object
+label: Override Test_ Deeply
+referenceField: id
+meta:
+ hash: JPYpOfi5x9JdHEush+FzeoW2Ybs=
diff --git a/packages/editor/.flatbread/schemas/override-test__content.yaml b/packages/editor/.flatbread/schemas/override-test__content.yaml
new file mode 100644
index 00000000..e2748895
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test__content.yaml
@@ -0,0 +1,23 @@
+name: OverrideTest__content
+kind: OBJECT
+fields:
+ - label: Excerpt
+ name: excerpt
+ description: A plaintext excerpt taken from the main content
+ component: string
+ - label: Html
+ name: html
+ description: The content as HTML
+ component: string
+ - label: Raw
+ name: raw
+ component: string
+ - label: Timetoread
+ name: timeToRead
+ description: How long (in minutes) it would take an average reader to read the main content.
+ component: int
+component: object
+label: Override Test__content
+referenceField: id
+meta:
+ hash: vuNQhfGHdxZdWDR+JoDUvw9iWoY=
diff --git a/packages/editor/.flatbread/schemas/override-test__metadata.yaml b/packages/editor/.flatbread/schemas/override-test__metadata.yaml
new file mode 100644
index 00000000..7625bde2
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test__metadata.yaml
@@ -0,0 +1,30 @@
+name: OverrideTest__metadata
+kind: OBJECT
+fields:
+ - label: Collection
+ name: collection
+ component: string
+ - label: Reference
+ name: reference
+ component: string
+ - label: Referencefield
+ name: referenceField
+ component: string
+ - label: Sourcedby
+ name: sourcedBy
+ component: string
+ - label: Transformcontext
+ name: transformContext
+ component: json
+ - label: Transformedby
+ name: transformedBy
+ component: string
+ - label: Sourcecontext
+ name: sourceContext
+ component: object
+ collection: OverrideTest__metadata_SourceContext
+component: object
+label: Override Test__metadata
+referenceField: id
+meta:
+ hash: KixWfqfskAAu42t6siU5TWzQ1Jg=
diff --git a/packages/editor/.flatbread/schemas/override-test__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/override-test__metadata_-source-context.yaml
new file mode 100644
index 00000000..aa9bd119
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/override-test__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: OverrideTest__metadata_SourceContext
+kind: OBJECT
+fields:
+ - label: Filename
+ name: filename
+ component: string
+ - label: Path
+ name: path
+ component: string
+ - label: Slug
+ name: slug
+ component: string
+component: object
+label: Override Test__metadata_ Source Context
+referenceField: id
+meta:
+ hash: iYdBWS63mqNZRr7IFEPmfogd2tw=
diff --git a/packages/editor/.flatbread/schemas/post-category.yaml b/packages/editor/.flatbread/schemas/post-category.yaml
new file mode 100644
index 00000000..d0e2d9b6
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category.yaml
@@ -0,0 +1,44 @@
+name: PostCategory
+kind: OBJECT
+fields:
+ - label: Title
+ name: title
+ component: string
+ - label: Category
+ name: category
+ component: string
+ - label: Rating
+ name: rating
+ component: float
+ - label: Slug
+ name: slug
+ component: string
+ - label: Authors
+ name: authors
+ description: All Authors that are referenced by this PostCategory
+ component: list
+ - label: Collection
+ name: _collection
+ description: The collection name
+ disabled: true
+ component: string
+ - label: Id
+ name: id
+ disabled: true
+ component: string
+ - label: Content
+ name: _content
+ disabled: true
+ component: object
+ collection: PostCategory__content
+ - label: Metadata
+ name: _metadata
+ disabled: true
+ component: object
+ collection: PostCategory__metadata
+component: object
+label: Post Category
+pluralName: Post Categories
+referenceField: title
+meta:
+ hash: tcwprbAYH9iqUyH8YR9c7zBOdPI=
diff --git a/packages/editor/.flatbread/schemas/post-category__content.yaml b/packages/editor/.flatbread/schemas/post-category__content.yaml
new file mode 100644
index 00000000..df69bc4c
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category__content.yaml
@@ -0,0 +1,23 @@
+name: PostCategory__content
+kind: OBJECT
+fields:
+ - label: Excerpt
+ name: excerpt
+ description: A plaintext excerpt taken from the main content
+ component: string
+ - label: Html
+ name: html
+ description: The content as HTML
+ component: string
+ - label: Raw
+ name: raw
+ component: string
+ - label: Timetoread
+ name: timeToRead
+ description: How long (in minutes) it would take an average reader to read the main content.
+ component: int
+component: object
+label: Post Category__content
+referenceField: id
+meta:
+ hash: 0WeMO01dh/WzfHFXy1myQ/oF5f0=
diff --git a/packages/editor/.flatbread/schemas/post-category__metadata.yaml b/packages/editor/.flatbread/schemas/post-category__metadata.yaml
new file mode 100644
index 00000000..165e3ac6
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category__metadata.yaml
@@ -0,0 +1,30 @@
+name: PostCategory__metadata
+kind: OBJECT
+fields:
+ - label: Collection
+ name: collection
+ component: string
+ - label: Reference
+ name: reference
+ component: string
+ - label: Referencefield
+ name: referenceField
+ component: string
+ - label: Sourcedby
+ name: sourcedBy
+ component: string
+ - label: Transformcontext
+ name: transformContext
+ component: json
+ - label: Transformedby
+ name: transformedBy
+ component: string
+ - label: Sourcecontext
+ name: sourceContext
+ component: object
+ collection: PostCategory__metadata_SourceContext
+component: object
+label: Post Category__metadata
+referenceField: id
+meta:
+ hash: ohMlDKpJ3ab37oMAGyO1/HM6c5c=
diff --git a/packages/editor/.flatbread/schemas/post-category__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/post-category__metadata_-source-context.yaml
new file mode 100644
index 00000000..be5d2d7c
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post-category__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: PostCategory__metadata_SourceContext
+kind: OBJECT
+fields:
+ - label: Filename
+ name: filename
+ component: string
+ - label: Path
+ name: path
+ component: string
+ - label: Slug
+ name: slug
+ component: string
+component: object
+label: Post Category__metadata_ Source Context
+referenceField: id
+meta:
+ hash: C5VfOGT28XiLb1SnWyM/XJIEGfE=
diff --git a/packages/editor/.flatbread/schemas/post.yaml b/packages/editor/.flatbread/schemas/post.yaml
new file mode 100644
index 00000000..effe61c5
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post.yaml
@@ -0,0 +1,38 @@
+name: Post
+kind: OBJECT
+fields:
+ - label: Title
+ name: title
+ component: string
+ - label: Rating
+ name: rating
+ component: float
+ - label: Authors
+ name: authors
+ description: All Authors that are referenced by this Post
+ component: list
+ - label: Collection
+ name: _collection
+ description: The collection name
+ disabled: true
+ component: string
+ - label: Id
+ name: id
+ disabled: true
+ component: string
+ - label: Content
+ name: _content
+ disabled: true
+ component: object
+ collection: Post__content
+ - label: Metadata
+ name: _metadata
+ disabled: true
+ component: object
+ collection: Post__metadata
+component: object
+label: Post
+pluralName: Posts
+referenceField: title
+meta:
+ hash: LllYynCtbVNDF8wA8Gj5NcR/ypY=
diff --git a/packages/editor/.flatbread/schemas/post__content.yaml b/packages/editor/.flatbread/schemas/post__content.yaml
new file mode 100644
index 00000000..cc82d3e2
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post__content.yaml
@@ -0,0 +1,23 @@
+name: Post__content
+kind: OBJECT
+fields:
+ - label: Excerpt
+ name: excerpt
+ description: A plaintext excerpt taken from the main content
+ component: string
+ - label: Html
+ name: html
+ description: The content as HTML
+ component: string
+ - label: Raw
+ name: raw
+ component: string
+ - label: Timetoread
+ name: timeToRead
+ description: How long (in minutes) it would take an average reader to read the main content.
+ component: int
+component: object
+label: Post__content
+referenceField: id
+meta:
+ hash: KC6ZT6xj6NEQ80UolzqR3W8mJo8=
diff --git a/packages/editor/.flatbread/schemas/post__metadata.yaml b/packages/editor/.flatbread/schemas/post__metadata.yaml
new file mode 100644
index 00000000..2e31b39d
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post__metadata.yaml
@@ -0,0 +1,30 @@
+name: Post__metadata
+kind: OBJECT
+fields:
+ - label: Collection
+ name: collection
+ component: string
+ - label: Reference
+ name: reference
+ component: string
+ - label: Referencefield
+ name: referenceField
+ component: string
+ - label: Sourcedby
+ name: sourcedBy
+ component: string
+ - label: Transformcontext
+ name: transformContext
+ component: json
+ - label: Transformedby
+ name: transformedBy
+ component: string
+ - label: Sourcecontext
+ name: sourceContext
+ component: object
+ collection: Post__metadata_SourceContext
+component: object
+label: Post__metadata
+referenceField: id
+meta:
+ hash: MkLyV6C1rG2QFAFpCQkQfgEZK7o=
diff --git a/packages/editor/.flatbread/schemas/post__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/post__metadata_-source-context.yaml
new file mode 100644
index 00000000..67cb5091
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/post__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: Post__metadata_SourceContext
+kind: OBJECT
+fields:
+ - label: Filename
+ name: filename
+ component: string
+ - label: Path
+ name: path
+ component: string
+ - label: Slug
+ name: slug
+ component: string
+component: object
+label: Post__metadata_ Source Context
+referenceField: id
+meta:
+ hash: fGr5kTUqwaMCcB0DWKZtfsEGUhg=
diff --git a/packages/editor/.flatbread/schemas/query.yaml b/packages/editor/.flatbread/schemas/query.yaml
new file mode 100644
index 00000000..2b2c6407
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/query.yaml
@@ -0,0 +1,73 @@
+name: Query
+kind: OBJECT
+fields:
+ - label: Fakeauthor
+ name: fakeAuthor
+ description: fake resolver
+ component: string
+ - label: Fakeoverridetest
+ name: fakeOverrideTest
+ description: fake resolver
+ component: string
+ - label: Fakepost
+ name: fakePost
+ description: fake resolver
+ component: string
+ - label: Fakepostcategory
+ name: fakePostCategory
+ description: fake resolver
+ component: string
+ - label: Fakeyamlauthor
+ name: fakeYamlAuthor
+ description: fake resolver
+ component: string
+ - label: Allauthors
+ name: allAuthors
+ description: Return a set of Authors
+ component: list
+ - label: Alloverridetests
+ name: allOverrideTests
+ description: Return a set of OverrideTests
+ component: list
+ - label: Allpostcategories
+ name: allPostCategories
+ description: Return a set of PostCategories
+ component: list
+ - label: Allposts
+ name: allPosts
+ description: Return a set of Posts
+ component: list
+ - label: Allyamlauthors
+ name: allYamlAuthors
+ description: Return a set of YamlAuthors
+ component: list
+ - label: Author
+ name: Author
+ description: Find one Author by its ID
+ component: object
+ collection: Author
+ - label: Overridetest
+ name: OverrideTest
+ description: Find one OverrideTest by its ID
+ component: object
+ collection: OverrideTest
+ - label: Post
+ name: Post
+ description: Find one Post by its ID
+ component: object
+ collection: Post
+ - label: Postcategory
+ name: PostCategory
+ description: Find one PostCategory by its ID
+ component: object
+ collection: PostCategory
+ - label: Yamlauthor
+ name: YamlAuthor
+ description: Find one YamlAuthor by its ID
+ component: object
+ collection: YamlAuthor
+component: object
+label: Query
+referenceField: id
+meta:
+ hash: iqYXAmXfI7xEPRotyw5ZH37w2L4=
diff --git a/packages/editor/.flatbread/schemas/svimg.yaml b/packages/editor/.flatbread/schemas/svimg.yaml
new file mode 100644
index 00000000..1c1ea54e
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/svimg.yaml
@@ -0,0 +1,33 @@
+name: Svimg
+description: An Image Optimized by Svimg
+kind: OBJECT
+fields:
+ - label: Aspectratio
+ name: aspectratio
+ description: Aspect ratio of image
+ component: float
+ - label: Placeholder
+ name: placeholder
+ description: 'inline blurred placeholder image -- returns null if disabled via skipPlaceholder: true in config'
+ component: string
+ - label: Raw
+ name: raw
+ description: The raw value supplied from config
+ component: string
+ - label: Srcset
+ name: srcset
+ description: Responsive images and widths
+ component: string
+ - label: Srcsetavif
+ name: srcsetavif
+ description: 'Responsive Avif images and widths -- returns null if disabled via avif: false in config'
+ component: string
+ - label: Srcsetwebp
+ name: srcsetwebp
+ description: 'Responsive WebP images and widths -- returns null if disabled via webp: false in config'
+ component: string
+component: object
+label: Svimg
+referenceField: id
+meta:
+ hash: GnCxN+wFSZ8m4KacYt/7Yoaw/xk=
diff --git a/packages/editor/.flatbread/schemas/yaml-author.yaml b/packages/editor/.flatbread/schemas/yaml-author.yaml
new file mode 100644
index 00000000..c3211d0f
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author.yaml
@@ -0,0 +1,46 @@
+name: YamlAuthor
+kind: OBJECT
+fields:
+ - label: Name
+ name: name
+ component: string
+ - label: Date joined
+ name: date_joined
+ component: date
+ - label: Enjoys
+ name: enjoys
+ component: list
+ - label: Friend
+ name: friend
+ description: The YamlAuthor referenced by this YamlAuthor
+ component: object
+ collection: YamlAuthor
+ - label: Skills
+ name: skills
+ component: object
+ collection: YamlAuthor_Skills
+ - label: Collection
+ name: _collection
+ description: The collection name
+ disabled: true
+ component: string
+ - label: Id
+ name: id
+ disabled: true
+ component: string
+ - label: Content
+ name: _content
+ disabled: true
+ component: object
+ collection: YamlAuthor__content
+ - label: Metadata
+ name: _metadata
+ disabled: true
+ component: object
+ collection: YamlAuthor__metadata
+component: object
+label: Yaml Author
+pluralName: Yaml Authors
+referenceField: name
+meta:
+ hash: 6Qoac76cYXfo2rmktr9sRMg7bbU=
diff --git a/packages/editor/.flatbread/schemas/yaml-author_-skills.yaml b/packages/editor/.flatbread/schemas/yaml-author_-skills.yaml
new file mode 100644
index 00000000..a7e19956
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author_-skills.yaml
@@ -0,0 +1,26 @@
+name: YamlAuthor_Skills
+kind: OBJECT
+fields:
+ - label: Breathing
+ name: breathing
+ component: float
+ - label: Cat pat
+ name: cat_pat
+ component: float
+ - label: Existence
+ name: existence
+ component: string
+ - label: Liquid consumption
+ name: liquid_consumption
+ component: float
+ - label: Sitting
+ name: sitting
+ component: float
+ - label: Sports
+ name: sports
+ component: float
+component: object
+label: Yaml Author_ Skills
+referenceField: id
+meta:
+ hash: MUOpWQ0pjfaKHhaaOYZsP7fQFsA=
diff --git a/packages/editor/.flatbread/schemas/yaml-author__content.yaml b/packages/editor/.flatbread/schemas/yaml-author__content.yaml
new file mode 100644
index 00000000..c5a39218
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author__content.yaml
@@ -0,0 +1,20 @@
+name: YamlAuthor__content
+kind: OBJECT
+fields:
+ - label: Excerpt
+ name: excerpt
+ description: A plaintext excerpt taken from the main content
+ component: string
+ - label: Html
+ name: html
+ description: The content as HTML
+ component: string
+ - label: Timetoread
+ name: timeToRead
+ description: How long (in minutes) it would take an average reader to read the main content.
+ component: int
+component: object
+label: Yaml Author__content
+referenceField: id
+meta:
+ hash: JYC+GoUaXhIhwx/Fokj49mFJq6o=
diff --git a/packages/editor/.flatbread/schemas/yaml-author__metadata.yaml b/packages/editor/.flatbread/schemas/yaml-author__metadata.yaml
new file mode 100644
index 00000000..4cc57eb4
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author__metadata.yaml
@@ -0,0 +1,30 @@
+name: YamlAuthor__metadata
+kind: OBJECT
+fields:
+ - label: Collection
+ name: collection
+ component: string
+ - label: Reference
+ name: reference
+ component: string
+ - label: Referencefield
+ name: referenceField
+ component: string
+ - label: Sourcedby
+ name: sourcedBy
+ component: string
+ - label: Transformcontext
+ name: transformContext
+ component: json
+ - label: Transformedby
+ name: transformedBy
+ component: string
+ - label: Sourcecontext
+ name: sourceContext
+ component: object
+ collection: YamlAuthor__metadata_SourceContext
+component: object
+label: Yaml Author__metadata
+referenceField: id
+meta:
+ hash: 4Bt4Y6vbWdX6IdRXkAHRQnAaTbY=
diff --git a/packages/editor/.flatbread/schemas/yaml-author__metadata_-source-context.yaml b/packages/editor/.flatbread/schemas/yaml-author__metadata_-source-context.yaml
new file mode 100644
index 00000000..a5048ad0
--- /dev/null
+++ b/packages/editor/.flatbread/schemas/yaml-author__metadata_-source-context.yaml
@@ -0,0 +1,17 @@
+name: YamlAuthor__metadata_SourceContext
+kind: OBJECT
+fields:
+ - label: Filename
+ name: filename
+ component: string
+ - label: Path
+ name: path
+ component: string
+ - label: Slug
+ name: slug
+ component: string
+component: object
+label: Yaml Author__metadata_ Source Context
+referenceField: id
+meta:
+ hash: oysLojANVjgNVlOII6KL9GlsTYw=
diff --git a/packages/editor/.gitignore b/packages/editor/.gitignore
new file mode 100644
index 00000000..f4401a32
--- /dev/null
+++ b/packages/editor/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+node_modules
+/build
+/.svelte-kit
+/package
+.env
+.env.*
+!.env.example
diff --git a/packages/editor/.npmrc b/packages/editor/.npmrc
new file mode 100644
index 00000000..b6f27f13
--- /dev/null
+++ b/packages/editor/.npmrc
@@ -0,0 +1 @@
+engine-strict=true
diff --git a/packages/editor/.prettierignore b/packages/editor/.prettierignore
new file mode 100644
index 00000000..38972655
--- /dev/null
+++ b/packages/editor/.prettierignore
@@ -0,0 +1,13 @@
+.DS_Store
+node_modules
+/build
+/.svelte-kit
+/package
+.env
+.env.*
+!.env.example
+
+# Ignore files for PNPM, NPM and YARN
+pnpm-lock.yaml
+package-lock.json
+yarn.lock
diff --git a/packages/editor/.prettierrc b/packages/editor/.prettierrc
new file mode 100644
index 00000000..ff2677ef
--- /dev/null
+++ b/packages/editor/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "useTabs": true,
+ "singleQuote": true,
+ "trailingComma": "none",
+ "printWidth": 100
+}
diff --git a/packages/editor/README.md b/packages/editor/README.md
new file mode 100644
index 00000000..5c91169b
--- /dev/null
+++ b/packages/editor/README.md
@@ -0,0 +1,38 @@
+# create-svelte
+
+Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).
+
+## Creating a project
+
+If you're seeing this, you've probably already done this step. Congrats!
+
+```bash
+# create a new project in the current directory
+npm create svelte@latest
+
+# create a new project in my-app
+npm create svelte@latest my-app
+```
+
+## Developing
+
+Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server:
+
+```bash
+npm run dev
+
+# or start the server and open the app in a new browser tab
+npm run dev -- --open
+```
+
+## Building
+
+To create a production version of your app:
+
+```bash
+npm run build
+```
+
+You can preview the production build with `npm run preview`.
+
+> To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
diff --git a/packages/editor/app.html b/packages/editor/app.html
new file mode 100644
index 00000000..5b53ef7e
--- /dev/null
+++ b/packages/editor/app.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+ %sveltekit.body%
+
+
diff --git a/packages/editor/package.json b/packages/editor/package.json
new file mode 100644
index 00000000..958bedac
--- /dev/null
+++ b/packages/editor/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "@flatbread/editor",
+ "version": "0.0.1",
+ "types": "module",
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "package": "svelte-kit package",
+ "preview": "vite preview",
+ "prepare": "svelte-kit sync",
+ "check": "svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch",
+ "lint": "prettier --check --plugin-search-dir=. . && eslint .",
+ "format": "prettier --write --plugin-search-dir=. ."
+ },
+ "devDependencies": {
+ "@sveltejs/adapter-auto": "next",
+ "@sveltejs/kit": "next",
+ "@typescript-eslint/eslint-plugin": "^5.31.0",
+ "@typescript-eslint/parser": "^5.31.0",
+ "eslint": "^8.20.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-svelte3": "^4.0.0",
+ "prettier": "^2.7.1",
+ "prettier-plugin-svelte": "^2.7.0",
+ "sass": "^1.54.0",
+ "svelte": "^3.49.0",
+ "svelte-check": "^2.8.0",
+ "svelte-preprocess": "^4.10.7",
+ "tslib": "^2.4.0",
+ "typescript": "^4.7.4",
+ "vite": "^3.0.3"
+ },
+ "type": "module",
+ "dependencies": {
+ "@picocss/pico": "^1.5.3",
+ "@types/js-yaml": "^4.0.5",
+ "@types/lodash-es": "^4.17.6",
+ "js-yaml": "^4.1.0",
+ "lodash-es": "^4.17.21",
+ "node-fetch": "^3.2.9",
+ "svimg": "3.1.0",
+ "wretch": "^1.7.10"
+ }
+}
diff --git a/packages/editor/pnpm-lock.yaml b/packages/editor/pnpm-lock.yaml
new file mode 100644
index 00000000..e4ec3143
--- /dev/null
+++ b/packages/editor/pnpm-lock.yaml
@@ -0,0 +1,1965 @@
+lockfileVersion: 5.4
+
+specifiers:
+ '@sveltejs/adapter-auto': next
+ '@sveltejs/kit': next
+ '@typescript-eslint/eslint-plugin': ^5.27.0
+ '@typescript-eslint/parser': ^5.27.0
+ eslint: ^8.16.0
+ eslint-config-prettier: ^8.3.0
+ eslint-plugin-svelte3: ^4.0.0
+ prettier: ^2.6.2
+ prettier-plugin-svelte: ^2.7.0
+ svelte: ^3.44.0
+ svelte-check: ^2.7.1
+ svelte-preprocess: ^4.10.6
+ tslib: ^2.3.1
+ typescript: ^4.7.4
+ vite: ^3.0.0
+
+devDependencies:
+ '@sveltejs/adapter-auto': 1.0.0-next.64
+ '@sveltejs/kit': 1.0.0-next.396_svelte@3.49.0+vite@3.0.3
+ '@typescript-eslint/eslint-plugin': 5.31.0_d5zwcxr4bwkhmuo464cb3a2puu
+ '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa
+ eslint: 8.20.0
+ eslint-config-prettier: 8.5.0_eslint@8.20.0
+ eslint-plugin-svelte3: 4.0.0_piwa6j2njmnknm35bh3wz5v52y
+ prettier: 2.7.1
+ prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi
+ svelte: 3.49.0
+ svelte-check: 2.8.0_svelte@3.49.0
+ svelte-preprocess: 4.10.7_uslzfc62di2n2otc2tvfklnwji
+ tslib: 2.4.0
+ typescript: 4.7.4
+ vite: 3.0.3
+
+packages:
+
+ /@cloudflare/workers-types/3.14.1:
+ resolution: {integrity: sha512-B1/plF62pt+H2IJHvApK8fdOJAVsvojvacuac8x8s+JIyqbropMyqNqHTKLm3YD8ZFLGwYeFTudU+PQ7vGvBdA==}
+ dev: true
+
+ /@eslint/eslintrc/1.3.0:
+ resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.3.2
+ globals: 13.17.0
+ ignore: 5.2.0
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/config-array/0.9.5:
+ resolution: {integrity: sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/object-schema/1.2.1:
+ resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+ dev: true
+
+ /@iarna/toml/2.2.5:
+ resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==}
+ dev: true
+
+ /@jridgewell/resolve-uri/3.1.0:
+ resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec/1.4.14:
+ resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+ dev: true
+
+ /@jridgewell/trace-mapping/0.3.14:
+ resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.0
+ '@jridgewell/sourcemap-codec': 1.4.14
+ dev: true
+
+ /@mapbox/node-pre-gyp/1.0.9:
+ resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==}
+ hasBin: true
+ dependencies:
+ detect-libc: 2.0.1
+ https-proxy-agent: 5.0.1
+ make-dir: 3.1.0
+ node-fetch: 2.6.7
+ nopt: 5.0.0
+ npmlog: 5.0.1
+ rimraf: 3.0.2
+ semver: 7.3.7
+ tar: 6.1.11
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@nodelib/fs.scandir/2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+ dev: true
+
+ /@nodelib/fs.stat/2.0.5:
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /@nodelib/fs.walk/1.2.8:
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.13.0
+ dev: true
+
+ /@rollup/pluginutils/4.2.1:
+ resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+ engines: {node: '>= 8.0.0'}
+ dependencies:
+ estree-walker: 2.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /@sveltejs/adapter-auto/1.0.0-next.64:
+ resolution: {integrity: sha512-Q8DwcS6wl1GovzS9JJzaD/WL/Lfk1ur4nAF1HtmsUvZDpsPBVDqnK2AhYU4G3oFNiuHstrjAogMy5th8ptSFGw==}
+ dependencies:
+ '@sveltejs/adapter-cloudflare': 1.0.0-next.31
+ '@sveltejs/adapter-netlify': 1.0.0-next.71
+ '@sveltejs/adapter-vercel': 1.0.0-next.66
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@sveltejs/adapter-cloudflare/1.0.0-next.31:
+ resolution: {integrity: sha512-HhEFZP72GJ8AZGgFECKIiayDcLaAWi65pI0AnBfiNhCifYSlH/mPNWNVD4AWRDnXnH6XU+FLwhGDnIDwytTyYg==}
+ dependencies:
+ '@cloudflare/workers-types': 3.14.1
+ esbuild: 0.14.50
+ worktop: 0.8.0-next.14
+ dev: true
+
+ /@sveltejs/adapter-netlify/1.0.0-next.71:
+ resolution: {integrity: sha512-la1CGtWO1xul1L3zEoFAoc4EX2uxZjrZcOMS3tkKB8drxhbQsNbnTE6fmSSMFiZXhxaikczrBgQwqIaDkLTmZg==}
+ dependencies:
+ '@iarna/toml': 2.2.5
+ esbuild: 0.14.50
+ set-cookie-parser: 2.5.1
+ tiny-glob: 0.2.9
+ dev: true
+
+ /@sveltejs/adapter-vercel/1.0.0-next.66:
+ resolution: {integrity: sha512-s3Hcxu9nCG/rR3C3cFbdQGjTa5W4K2kRcc6S5Xefx7itbrw+4v3KpO8ZPB6qM55XDwVxuG7260NMHVI6MUGmSA==}
+ dependencies:
+ '@vercel/nft': 0.21.0
+ esbuild: 0.14.50
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@sveltejs/kit/1.0.0-next.396_svelte@3.49.0+vite@3.0.3:
+ resolution: {integrity: sha512-bKFpuzp9QxPkOIOEIeNeedvxEMORNqBPxUmoJXDP/Se7MrSfcxYiamjBcKrG+bgGNWmV39nD3EvUox+CXno/Ig==}
+ engines: {node: '>=16.9'}
+ hasBin: true
+ peerDependencies:
+ svelte: ^3.44.0
+ vite: ^3.0.0
+ dependencies:
+ '@sveltejs/vite-plugin-svelte': 1.0.1_svelte@3.49.0+vite@3.0.3
+ chokidar: 3.5.3
+ sade: 1.8.1
+ svelte: 3.49.0
+ vite: 3.0.3
+ transitivePeerDependencies:
+ - diff-match-patch
+ - supports-color
+ dev: true
+
+ /@sveltejs/vite-plugin-svelte/1.0.1_svelte@3.49.0+vite@3.0.3:
+ resolution: {integrity: sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==}
+ engines: {node: ^14.18.0 || >= 16}
+ peerDependencies:
+ diff-match-patch: ^1.0.5
+ svelte: ^3.44.0
+ vite: ^3.0.0
+ peerDependenciesMeta:
+ diff-match-patch:
+ optional: true
+ dependencies:
+ '@rollup/pluginutils': 4.2.1
+ debug: 4.3.4
+ deepmerge: 4.2.2
+ kleur: 4.1.5
+ magic-string: 0.26.2
+ svelte: 3.49.0
+ svelte-hmr: 0.14.12_svelte@3.49.0
+ vite: 3.0.3
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@types/json-schema/7.0.11:
+ resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
+ dev: true
+
+ /@types/node/18.6.1:
+ resolution: {integrity: sha512-z+2vB6yDt1fNwKOeGbckpmirO+VBDuQqecXkgeIqDlaOtmKn6hPR/viQ8cxCfqLU4fTlvM3+YjM367TukWdxpg==}
+ dev: true
+
+ /@types/pug/2.0.6:
+ resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==}
+ dev: true
+
+ /@types/sass/1.43.1:
+ resolution: {integrity: sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==}
+ dependencies:
+ '@types/node': 18.6.1
+ dev: true
+
+ /@typescript-eslint/eslint-plugin/5.31.0_d5zwcxr4bwkhmuo464cb3a2puu:
+ resolution: {integrity: sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.31.0_he2ccbldppg44uulnyq4rwocfa
+ '@typescript-eslint/scope-manager': 5.31.0
+ '@typescript-eslint/type-utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa
+ '@typescript-eslint/utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa
+ debug: 4.3.4
+ eslint: 8.20.0
+ functional-red-black-tree: 1.0.1
+ ignore: 5.2.0
+ regexpp: 3.2.0
+ semver: 7.3.7
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser/5.31.0_he2ccbldppg44uulnyq4rwocfa:
+ resolution: {integrity: sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.31.0
+ '@typescript-eslint/types': 5.31.0
+ '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.7.4
+ debug: 4.3.4
+ eslint: 8.20.0
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/scope-manager/5.31.0:
+ resolution: {integrity: sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.31.0
+ '@typescript-eslint/visitor-keys': 5.31.0
+ dev: true
+
+ /@typescript-eslint/type-utils/5.31.0_he2ccbldppg44uulnyq4rwocfa:
+ resolution: {integrity: sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/utils': 5.31.0_he2ccbldppg44uulnyq4rwocfa
+ debug: 4.3.4
+ eslint: 8.20.0
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types/5.31.0:
+ resolution: {integrity: sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree/5.31.0_typescript@4.7.4:
+ resolution: {integrity: sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.31.0
+ '@typescript-eslint/visitor-keys': 5.31.0
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.7
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils/5.31.0_he2ccbldppg44uulnyq4rwocfa:
+ resolution: {integrity: sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@types/json-schema': 7.0.11
+ '@typescript-eslint/scope-manager': 5.31.0
+ '@typescript-eslint/types': 5.31.0
+ '@typescript-eslint/typescript-estree': 5.31.0_typescript@4.7.4
+ eslint: 8.20.0
+ eslint-scope: 5.1.1
+ eslint-utils: 3.0.0_eslint@8.20.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/visitor-keys/5.31.0:
+ resolution: {integrity: sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.31.0
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /@vercel/nft/0.21.0:
+ resolution: {integrity: sha512-hFCAETfI5cG8l5iAiLhMC2bReC5K7SIybzrxGorv+eGspIbIFsVw7Vg85GovXm/LxA08pIDrAlrhR6GN36XB/Q==}
+ hasBin: true
+ dependencies:
+ '@mapbox/node-pre-gyp': 1.0.9
+ acorn: 8.8.0
+ async-sema: 3.1.1
+ bindings: 1.5.0
+ estree-walker: 2.0.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ micromatch: 4.0.5
+ node-gyp-build: 4.5.0
+ resolve-from: 5.0.0
+ rollup-pluginutils: 2.8.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /abbrev/1.1.1:
+ resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+ dev: true
+
+ /acorn-jsx/5.3.2_acorn@8.8.0:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.8.0
+ dev: true
+
+ /acorn/8.8.0:
+ resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /agent-base/6.0.2:
+ resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+ engines: {node: '>= 6.0.0'}
+ dependencies:
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /ajv/6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-regex/5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ansi-styles/4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+ dev: true
+
+ /anymatch/3.1.2:
+ resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+ dev: true
+
+ /aproba/2.0.0:
+ resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
+ dev: true
+
+ /are-we-there-yet/2.0.0:
+ resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
+ engines: {node: '>=10'}
+ dependencies:
+ delegates: 1.0.0
+ readable-stream: 3.6.0
+ dev: true
+
+ /argparse/2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /array-union/2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /async-sema/3.1.1:
+ resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==}
+ dev: true
+
+ /balanced-match/1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /binary-extensions/2.2.0:
+ resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /bindings/1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+ dependencies:
+ file-uri-to-path: 1.0.0
+ dev: true
+
+ /brace-expansion/1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /braces/3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+ dev: true
+
+ /buffer-crc32/0.2.13:
+ resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+ dev: true
+
+ /callsites/3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /chalk/4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+ dev: true
+
+ /chokidar/3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.2
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /chownr/2.0.0:
+ resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /color-convert/2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+ dev: true
+
+ /color-name/1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ dev: true
+
+ /color-support/1.1.3:
+ resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
+ hasBin: true
+ dev: true
+
+ /concat-map/0.0.1:
+ resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
+ dev: true
+
+ /console-control-strings/1.1.0:
+ resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
+ dev: true
+
+ /cross-spawn/7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /debug/4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /deep-is/0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /deepmerge/4.2.2:
+ resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /delegates/1.0.0:
+ resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
+ dev: true
+
+ /detect-indent/6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /detect-libc/2.0.1:
+ resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /dir-glob/3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+ dev: true
+
+ /doctrine/3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /emoji-regex/8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+ dev: true
+
+ /es6-promise/3.3.1:
+ resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
+ dev: true
+
+ /esbuild-android-64/0.14.50:
+ resolution: {integrity: sha512-H7iUEm7gUJHzidsBlFPGF6FTExazcgXL/46xxLo6i6bMtPim6ZmXyTccS8yOMpy6HAC6dPZ/JCQqrkkin69n6Q==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-android-arm64/0.14.50:
+ resolution: {integrity: sha512-NFaoqEwa+OYfoYVpQWDMdKII7wZZkAjtJFo1WdnBeCYlYikvUhTnf2aPwPu5qEAw/ie1NYK0yn3cafwP+kP+OQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-64/0.14.50:
+ resolution: {integrity: sha512-gDQsCvGnZiJv9cfdO48QqxkRV8oKAXgR2CGp7TdIpccwFdJMHf8hyIJhMW/05b/HJjET/26Us27Jx91BFfEVSA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-darwin-arm64/0.14.50:
+ resolution: {integrity: sha512-36nNs5OjKIb/Q50Sgp8+rYW/PqirRiFN0NFc9hEvgPzNJxeJedktXwzfJSln4EcRFRh5Vz4IlqFRScp+aiBBzA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-64/0.14.50:
+ resolution: {integrity: sha512-/1pHHCUem8e/R86/uR+4v5diI2CtBdiWKiqGuPa9b/0x3Nwdh5AOH7lj+8823C6uX1e0ufwkSLkS+aFZiBCWxA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-freebsd-arm64/0.14.50:
+ resolution: {integrity: sha512-iKwUVMQztnPZe5pUYHdMkRc9aSpvoV1mkuHlCoPtxZA3V+Kg/ptpzkcSY+fKd0kuom+l6Rc93k0UPVkP7xoqrw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-32/0.14.50:
+ resolution: {integrity: sha512-sWUwvf3uz7dFOpLzYuih+WQ7dRycrBWHCdoXJ4I4XdMxEHCECd8b7a9N9u7FzT6XR2gHPk9EzvchQUtiEMRwqw==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-64/0.14.50:
+ resolution: {integrity: sha512-u0PQxPhaeI629t4Y3EEcQ0wmWG+tC/LpP2K7yDFvwuPq0jSQ8SIN+ARNYfRjGW15O2we3XJvklbGV0wRuUCPig==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm/0.14.50:
+ resolution: {integrity: sha512-VALZq13bhmFJYFE/mLEb+9A0w5vo8z+YDVOWeaf9vOTrSC31RohRIwtxXBnVJ7YKLYfEMzcgFYf+OFln3Y0cWg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-arm64/0.14.50:
+ resolution: {integrity: sha512-ZyfoNgsTftD7Rp5S7La5auomKdNeB3Ck+kSKXC4pp96VnHyYGjHHXWIlcbH8i+efRn9brszo1/Thl1qn8RqmhQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-mips64le/0.14.50:
+ resolution: {integrity: sha512-ygo31Vxn/WrmjKCHkBoutOlFG5yM9J2UhzHb0oWD9O61dGg+Hzjz9hjf5cmM7FBhAzdpOdEWHIrVOg2YAi6rTw==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-ppc64le/0.14.50:
+ resolution: {integrity: sha512-xWCKU5UaiTUT6Wz/O7GKP9KWdfbsb7vhfgQzRfX4ahh5NZV4ozZ4+SdzYG8WxetsLy84UzLX3Pi++xpVn1OkFQ==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-riscv64/0.14.50:
+ resolution: {integrity: sha512-0+dsneSEihZTopoO9B6Z6K4j3uI7EdxBP7YSF5rTwUgCID+wHD3vM1gGT0m+pjCW+NOacU9kH/WE9N686FHAJg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-linux-s390x/0.14.50:
+ resolution: {integrity: sha512-tVjqcu8o0P9H4StwbIhL1sQYm5mWATlodKB6dpEZFkcyTI8kfIGWiWcrGmkNGH2i1kBUOsdlBafPxR3nzp3TDA==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-netbsd-64/0.14.50:
+ resolution: {integrity: sha512-0R/glfqAQ2q6MHDf7YJw/TulibugjizBxyPvZIcorH0Mb7vSimdHy0XF5uCba5CKt+r4wjax1mvO9lZ4jiAhEg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-openbsd-64/0.14.50:
+ resolution: {integrity: sha512-7PAtmrR5mDOFubXIkuxYQ4bdNS6XCK8AIIHUiZxq1kL8cFIH5731jPcXQ4JNy/wbj1C9sZ8rzD8BIM80Tqk29w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-sunos-64/0.14.50:
+ resolution: {integrity: sha512-gBxNY/wyptvD7PkHIYcq7se6SQEXcSC8Y7mE0FJB+CGgssEWf6vBPfTTZ2b6BWKnmaP6P6qb7s/KRIV5T2PxsQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-32/0.14.50:
+ resolution: {integrity: sha512-MOOe6J9cqe/iW1qbIVYSAqzJFh0p2LBLhVUIWdMVnNUNjvg2/4QNX4oT4IzgDeldU+Bym9/Tn6+DxvUHJXL5Zw==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-64/0.14.50:
+ resolution: {integrity: sha512-r/qE5Ex3w1jjGv/JlpPoWB365ldkppUlnizhMxJgojp907ZF1PgLTuW207kgzZcSCXyquL9qJkMsY+MRtaZ5yQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild-windows-arm64/0.14.50:
+ resolution: {integrity: sha512-EMS4lQnsIe12ZyAinOINx7eq2mjpDdhGZZWDwPZE/yUTN9cnc2Ze/xUTYIAyaJqrqQda3LnDpADKpvLvol6ENQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /esbuild/0.14.50:
+ resolution: {integrity: sha512-SbC3k35Ih2IC6trhbMYW7hYeGdjPKf9atTKwBUHqMCYFZZ9z8zhuvfnZihsnJypl74FjiAKjBRqFkBkAd0rS/w==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ esbuild-android-64: 0.14.50
+ esbuild-android-arm64: 0.14.50
+ esbuild-darwin-64: 0.14.50
+ esbuild-darwin-arm64: 0.14.50
+ esbuild-freebsd-64: 0.14.50
+ esbuild-freebsd-arm64: 0.14.50
+ esbuild-linux-32: 0.14.50
+ esbuild-linux-64: 0.14.50
+ esbuild-linux-arm: 0.14.50
+ esbuild-linux-arm64: 0.14.50
+ esbuild-linux-mips64le: 0.14.50
+ esbuild-linux-ppc64le: 0.14.50
+ esbuild-linux-riscv64: 0.14.50
+ esbuild-linux-s390x: 0.14.50
+ esbuild-netbsd-64: 0.14.50
+ esbuild-openbsd-64: 0.14.50
+ esbuild-sunos-64: 0.14.50
+ esbuild-windows-32: 0.14.50
+ esbuild-windows-64: 0.14.50
+ esbuild-windows-arm64: 0.14.50
+ dev: true
+
+ /escape-string-regexp/4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-config-prettier/8.5.0_eslint@8.20.0:
+ resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+ dependencies:
+ eslint: 8.20.0
+ dev: true
+
+ /eslint-plugin-svelte3/4.0.0_piwa6j2njmnknm35bh3wz5v52y:
+ resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==}
+ peerDependencies:
+ eslint: '>=8.0.0'
+ svelte: ^3.2.0
+ dependencies:
+ eslint: 8.20.0
+ svelte: 3.49.0
+ dev: true
+
+ /eslint-scope/5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+ dev: true
+
+ /eslint-scope/7.1.1:
+ resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-utils/3.0.0_eslint@8.20.0:
+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+ peerDependencies:
+ eslint: '>=5'
+ dependencies:
+ eslint: 8.20.0
+ eslint-visitor-keys: 2.1.0
+ dev: true
+
+ /eslint-visitor-keys/2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-visitor-keys/3.3.0:
+ resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /eslint/8.20.0:
+ resolution: {integrity: sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint/eslintrc': 1.3.0
+ '@humanwhocodes/config-array': 0.9.5
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.1.1
+ eslint-utils: 3.0.0_eslint@8.20.0
+ eslint-visitor-keys: 3.3.0
+ espree: 9.3.2
+ esquery: 1.4.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ functional-red-black-tree: 1.0.1
+ glob-parent: 6.0.2
+ globals: 13.17.0
+ ignore: 5.2.0
+ import-fresh: 3.3.0
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ js-yaml: 4.1.0
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.1
+ regexpp: 3.2.0
+ strip-ansi: 6.0.1
+ strip-json-comments: 3.1.1
+ text-table: 0.2.0
+ v8-compile-cache: 2.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree/9.3.2:
+ resolution: {integrity: sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.8.0
+ acorn-jsx: 5.3.2_acorn@8.8.0
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /esquery/1.4.0:
+ resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse/4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse/4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estraverse/5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estree-walker/0.6.1:
+ resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
+ dev: true
+
+ /estree-walker/2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+ dev: true
+
+ /esutils/2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /fast-deep-equal/3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-glob/3.2.11:
+ resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
+ engines: {node: '>=8.6.0'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.5
+ dev: true
+
+ /fast-json-stable-stringify/2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein/2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fastq/1.13.0:
+ resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
+ dependencies:
+ reusify: 1.0.4
+ dev: true
+
+ /file-entry-cache/6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.0.4
+ dev: true
+
+ /file-uri-to-path/1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+ dev: true
+
+ /fill-range/7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+ dev: true
+
+ /flat-cache/3.0.4:
+ resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.2.6
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted/3.2.6:
+ resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==}
+ dev: true
+
+ /fs-minipass/2.1.0:
+ resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ minipass: 3.3.4
+ dev: true
+
+ /fs.realpath/1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents/2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /function-bind/1.1.1:
+ resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+ dev: true
+
+ /functional-red-black-tree/1.0.1:
+ resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+ dev: true
+
+ /gauge/3.0.2:
+ resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ aproba: 2.0.0
+ color-support: 1.1.3
+ console-control-strings: 1.1.0
+ has-unicode: 2.0.1
+ object-assign: 4.1.1
+ signal-exit: 3.0.7
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wide-align: 1.1.5
+ dev: true
+
+ /glob-parent/5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob-parent/6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob/7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
+ /globals/13.17.0:
+ resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globalyzer/0.1.0:
+ resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
+ dev: true
+
+ /globby/11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ dependencies:
+ array-union: 2.1.0
+ dir-glob: 3.0.1
+ fast-glob: 3.2.11
+ ignore: 5.2.0
+ merge2: 1.4.1
+ slash: 3.0.0
+ dev: true
+
+ /globrex/0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+ dev: true
+
+ /graceful-fs/4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+ dev: true
+
+ /has-flag/4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /has-unicode/2.0.1:
+ resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
+ dev: true
+
+ /has/1.0.3:
+ resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+ engines: {node: '>= 0.4.0'}
+ dependencies:
+ function-bind: 1.1.1
+ dev: true
+
+ /https-proxy-agent/5.0.1:
+ resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ agent-base: 6.0.2
+ debug: 4.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /ignore/5.2.0:
+ resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
+ engines: {node: '>= 4'}
+ dev: true
+
+ /import-fresh/3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /imurmurhash/0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /inflight/1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits/2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+ dev: true
+
+ /is-binary-path/2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.2.0
+ dev: true
+
+ /is-core-module/2.9.0:
+ resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
+ dependencies:
+ has: 1.0.3
+ dev: true
+
+ /is-extglob/2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /is-fullwidth-code-point/3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-glob/4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+ dev: true
+
+ /is-number/7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+ dev: true
+
+ /isexe/2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /js-yaml/4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /json-schema-traverse/0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify/1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /kleur/4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /levn/0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lodash.merge/4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lru-cache/6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /magic-string/0.25.9:
+ resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+ dependencies:
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /magic-string/0.26.2:
+ resolution: {integrity: sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==}
+ engines: {node: '>=12'}
+ dependencies:
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /make-dir/3.1.0:
+ resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+ engines: {node: '>=8'}
+ dependencies:
+ semver: 6.3.0
+ dev: true
+
+ /merge2/1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /micromatch/4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+ dev: true
+
+ /min-indent/1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch/3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimist/1.2.6:
+ resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
+ dev: true
+
+ /minipass/3.3.4:
+ resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==}
+ engines: {node: '>=8'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /minizlib/2.1.2:
+ resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ minipass: 3.3.4
+ yallist: 4.0.0
+ dev: true
+
+ /mkdirp/0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.6
+ dev: true
+
+ /mkdirp/1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
+ /mri/1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /mrmime/1.0.1:
+ resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ms/2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+ dev: true
+
+ /nanoid/3.3.4:
+ resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+ dev: true
+
+ /natural-compare/1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /node-fetch/2.6.7:
+ resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+ dependencies:
+ whatwg-url: 5.0.0
+ dev: true
+
+ /node-gyp-build/4.5.0:
+ resolution: {integrity: sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==}
+ hasBin: true
+ dev: true
+
+ /nopt/5.0.0:
+ resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dependencies:
+ abbrev: 1.1.1
+ dev: true
+
+ /normalize-path/3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /npmlog/5.0.1:
+ resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
+ dependencies:
+ are-we-there-yet: 2.0.0
+ console-control-strings: 1.1.0
+ gauge: 3.0.2
+ set-blocking: 2.0.0
+ dev: true
+
+ /object-assign/4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /once/1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /optionator/0.9.1:
+ resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.3
+ dev: true
+
+ /parent-module/1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /path-is-absolute/1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-key/3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-parse/1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: true
+
+ /path-type/4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /picocolors/1.0.0:
+ resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+ dev: true
+
+ /picomatch/2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+ dev: true
+
+ /postcss/8.4.14:
+ resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.4
+ picocolors: 1.0.0
+ source-map-js: 1.0.2
+ dev: true
+
+ /prelude-ls/1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prettier-plugin-svelte/2.7.0_o3ioganyptcsrh6x4hnxvjkpqi:
+ resolution: {integrity: sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==}
+ peerDependencies:
+ prettier: ^1.16.4 || ^2.0.0
+ svelte: ^3.2.0
+ dependencies:
+ prettier: 2.7.1
+ svelte: 3.49.0
+ dev: true
+
+ /prettier/2.7.1:
+ resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+ dev: true
+
+ /punycode/2.1.1:
+ resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /queue-microtask/1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+ dev: true
+
+ /readable-stream/3.6.0:
+ resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+ dev: true
+
+ /readdirp/3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
+ /regexparam/2.0.1:
+ resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /regexpp/3.2.0:
+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve-from/4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-from/5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve/1.22.1:
+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.9.0
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /reusify/1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+ dev: true
+
+ /rimraf/2.7.1:
+ resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rimraf/3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rollup-pluginutils/2.8.2:
+ resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
+ dependencies:
+ estree-walker: 0.6.1
+ dev: true
+
+ /rollup/2.77.1:
+ resolution: {integrity: sha512-GhutNJrvTYD6s1moo+kyq7lD9DeR5HDyXo4bDFlDSkepC9kVKY+KK/NSZFzCmeXeia3kEzVuToQmHRdugyZHxw==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /run-parallel/1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+ dev: true
+
+ /sade/1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+ dependencies:
+ mri: 1.2.0
+ dev: true
+
+ /safe-buffer/5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+ dev: true
+
+ /sander/0.5.1:
+ resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
+ dependencies:
+ es6-promise: 3.3.1
+ graceful-fs: 4.2.10
+ mkdirp: 0.5.6
+ rimraf: 2.7.1
+ dev: true
+
+ /semver/6.3.0:
+ resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
+ hasBin: true
+ dev: true
+
+ /semver/7.3.7:
+ resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+ dev: true
+
+ /set-blocking/2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ dev: true
+
+ /set-cookie-parser/2.5.1:
+ resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==}
+ dev: true
+
+ /shebang-command/2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex/3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /signal-exit/3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+ dev: true
+
+ /slash/3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /sorcery/0.10.0:
+ resolution: {integrity: sha512-R5ocFmKZQFfSTstfOtHjJuAwbpGyf9qjQa1egyhvXSbM7emjrtLXtGdZsDJDABC85YBfVvrOiGWKSYXPKdvP1g==}
+ hasBin: true
+ dependencies:
+ buffer-crc32: 0.2.13
+ minimist: 1.2.6
+ sander: 0.5.1
+ sourcemap-codec: 1.4.8
+ dev: true
+
+ /source-map-js/1.0.2:
+ resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /sourcemap-codec/1.4.8:
+ resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+ dev: true
+
+ /string-width/4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string_decoder/1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
+ /strip-ansi/6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+ dev: true
+
+ /strip-indent/3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments/3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /supports-color/7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-preserve-symlinks-flag/1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /svelte-check/2.8.0_svelte@3.49.0:
+ resolution: {integrity: sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==}
+ hasBin: true
+ peerDependencies:
+ svelte: ^3.24.0
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.14
+ chokidar: 3.5.3
+ fast-glob: 3.2.11
+ import-fresh: 3.3.0
+ picocolors: 1.0.0
+ sade: 1.8.1
+ svelte: 3.49.0
+ svelte-preprocess: 4.10.7_uslzfc62di2n2otc2tvfklnwji
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - '@babel/core'
+ - coffeescript
+ - less
+ - node-sass
+ - postcss
+ - postcss-load-config
+ - pug
+ - sass
+ - stylus
+ - sugarss
+ dev: true
+
+ /svelte-hmr/0.14.12_svelte@3.49.0:
+ resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==}
+ engines: {node: ^12.20 || ^14.13.1 || >= 16}
+ peerDependencies:
+ svelte: '>=3.19.0'
+ dependencies:
+ svelte: 3.49.0
+ dev: true
+
+ /svelte-preprocess/4.10.7_uslzfc62di2n2otc2tvfklnwji:
+ resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
+ engines: {node: '>= 9.11.2'}
+ requiresBuild: true
+ peerDependencies:
+ '@babel/core': ^7.10.2
+ coffeescript: ^2.5.1
+ less: ^3.11.3 || ^4.0.0
+ node-sass: '*'
+ postcss: ^7 || ^8
+ postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
+ pug: ^3.0.0
+ sass: ^1.26.8
+ stylus: ^0.55.0
+ sugarss: ^2.0.0
+ svelte: ^3.23.0
+ typescript: ^3.9.5 || ^4.0.0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ coffeescript:
+ optional: true
+ less:
+ optional: true
+ node-sass:
+ optional: true
+ postcss:
+ optional: true
+ postcss-load-config:
+ optional: true
+ pug:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@types/pug': 2.0.6
+ '@types/sass': 1.43.1
+ detect-indent: 6.1.0
+ magic-string: 0.25.9
+ sorcery: 0.10.0
+ strip-indent: 3.0.0
+ svelte: 3.49.0
+ typescript: 4.7.4
+ dev: true
+
+ /svelte/3.49.0:
+ resolution: {integrity: sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==}
+ engines: {node: '>= 8'}
+ dev: true
+
+ /tar/6.1.11:
+ resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==}
+ engines: {node: '>= 10'}
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 3.3.4
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+ dev: true
+
+ /text-table/0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /tiny-glob/0.2.9:
+ resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
+ dependencies:
+ globalyzer: 0.1.0
+ globrex: 0.1.2
+ dev: true
+
+ /to-regex-range/5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+ dev: true
+
+ /tr46/0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+ dev: true
+
+ /tslib/1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ dev: true
+
+ /tslib/2.4.0:
+ resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
+ dev: true
+
+ /tsutils/3.21.0_typescript@4.7.4:
+ resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+ engines: {node: '>= 6'}
+ peerDependencies:
+ typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 4.7.4
+ dev: true
+
+ /type-check/0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-fest/0.20.2:
+ resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /typescript/4.7.4:
+ resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+ dev: true
+
+ /uri-js/4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.1.1
+ dev: true
+
+ /util-deprecate/1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ dev: true
+
+ /v8-compile-cache/2.3.0:
+ resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
+ dev: true
+
+ /vite/3.0.3:
+ resolution: {integrity: sha512-sDIpIcl3mv1NUaSzZwiXGEy1ZoWwwC2vkxUHY6yiDacR6zf//ZFuBJrozO62gedpE43pmxnLATNR5IYUdAEkMQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.14.50
+ postcss: 8.4.14
+ resolve: 1.22.1
+ rollup: 2.77.1
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
+ /webidl-conversions/3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+ dev: true
+
+ /whatwg-url/5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+ dev: true
+
+ /which/2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /wide-align/1.1.5:
+ resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
+ /word-wrap/1.2.3:
+ resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /worktop/0.8.0-next.14:
+ resolution: {integrity: sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==}
+ engines: {node: '>=12'}
+ dependencies:
+ mrmime: 1.0.1
+ regexparam: 2.0.1
+ dev: true
+
+ /wrappy/1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /yallist/4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ dev: true
diff --git a/packages/editor/src/app.d.ts b/packages/editor/src/app.d.ts
new file mode 100644
index 00000000..b28d8405
--- /dev/null
+++ b/packages/editor/src/app.d.ts
@@ -0,0 +1,11 @@
+///
+
+// See https://kit.svelte.dev/docs/types#app
+// for information about these interfaces
+// and what to do when importing types
+declare namespace App {
+ // interface Locals {}
+ // interface Platform {}
+ // interface Session {}
+ // interface Stuff {}
+}
diff --git a/packages/editor/src/app.html b/packages/editor/src/app.html
new file mode 100644
index 00000000..5b53ef7e
--- /dev/null
+++ b/packages/editor/src/app.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ %sveltekit.head%
+
+
+ %sveltekit.body%
+
+
diff --git a/packages/editor/src/hooks.ts b/packages/editor/src/hooks.ts
new file mode 100644
index 00000000..95e76419
--- /dev/null
+++ b/packages/editor/src/hooks.ts
@@ -0,0 +1,46 @@
+import { getGqlTypes } from '$lib/api';
+import { getNameFromLabel } from '$lib/schema';
+import type { QueryCollection, GqlSchema, Schema } from '$lib/types';
+
+/** @type {import('@sveltejs/kit').GetSession} */
+export function getSession(event) {
+ return {
+ ...event.locals
+ };
+}
+
+/** @type {import('@sveltejs/kit').Handle} */
+export async function handle({ event, resolve }) {
+ if (event.url.pathname.startsWith('/custom')) {
+ return new Response('custom response');
+ }
+
+ // TODO: figure out how to expose config for sub objects like Author_Skills
+ // maybe merge these types into the parent type under sub types?
+ // maybe transform all __schema.types into their own schema instead of targeting type Query
+
+ // transform gqlTypes first, then attach schemas
+
+ const { gqlTypes, queryListFields } = await getGqlTypes();
+
+ const queryTypesList = queryListFields
+ .map<[string, QueryCollection]>((field) => {
+ const newField = field as QueryCollection;
+ newField.schema = gqlTypes.get(newField?.type?.ofType?.name as string) as Schema;
+ newField.label = getNameFromLabel(newField.name);
+ return [field.name, newField];
+ })
+ .sort((a, b) => a[1].schema.pluralName.localeCompare(b[1].schema.pluralName));
+
+ const queryTypes = new Map(queryTypesList);
+
+ // gqlTypes.set('Query', queryTypes);
+
+ event.locals = {
+ gqlTypes,
+ queryTypes
+ };
+
+ const response = await resolve(event);
+ return response;
+}
diff --git a/packages/editor/src/lib/JsonCrush.ts b/packages/editor/src/lib/JsonCrush.ts
new file mode 100644
index 00000000..4b3d63b0
--- /dev/null
+++ b/packages/editor/src/lib/JsonCrush.ts
@@ -0,0 +1,10 @@
+// import JSONCrush from 'jsoncrush';
+
+// export default class JsonCrush {
+// static crush(obj: any) {
+// return encodeURIComponent(JSONCrush.crush(JSON.stringify(obj)));
+// }
+// static parse(str: string) {
+// return JSON.parse(JSONCrush.uncrush(str));
+// }
+// }
diff --git a/packages/editor/src/lib/api.ts b/packages/editor/src/lib/api.ts
new file mode 100644
index 00000000..f8fd2416
--- /dev/null
+++ b/packages/editor/src/lib/api.ts
@@ -0,0 +1,157 @@
+import type { GqlSchema, Schema } from '$lib/types';
+import { keyBy } from 'lodash-es';
+import wretch from 'wretch';
+import Config from './config';
+import { transformSchema } from './schema';
+
+const api = wretch().url('http://localhost:5057/graphql');
+
+export async function getSchema() {
+ const schema = await api
+ .post({
+ query: `
+ query Schema {
+ __schema {
+ types {
+ name
+ kind
+ description
+ }
+ }
+ }`
+ })
+ .json();
+ return schema.data.__schema;
+}
+
+export async function getCollectionFields(name: string) {
+ const schema = await api
+ .post({
+ query: `
+ query CollectionFields {
+ __type(name: "${name}") {
+ name
+ description
+ fields {
+ name
+ description
+ type {
+ kind
+ name
+ ofType {
+ name
+ kind
+ }
+ }
+ }
+ }
+ }
+ `
+ })
+ .json();
+ return schema.data.__type;
+}
+
+export async function getGqlTypes() {
+ const result = await api
+ .post({
+ query: `query CollectionFields {
+ __schema {
+ types {
+ name
+ description
+ kind
+ fields {
+ name
+ description
+ type {
+ kind
+ name
+ ofType {
+ name
+ kind
+ }
+ }
+ }
+ }
+ }
+ }`
+ })
+ .json();
+
+ const types: GqlSchema[] = result.data.__schema.types;
+ const queryListFields = (types.find((t) => t.name === 'Query') as GqlSchema).fields.filter(
+ (t) => t.type.kind === 'LIST'
+ );
+ const querySchema = keyBy(queryListFields, 'type.ofType.name');
+
+ const gqlTypes = await Promise.all(
+ types.map>(async (t) => {
+ const shouldConfig = !t.name.startsWith('__') && t.kind === 'OBJECT';
+ const schema = transformSchema(t, querySchema);
+ return [t.name, shouldConfig ? await Config.get(t.name, schema) : schema];
+ })
+ );
+
+ return {
+ gqlTypes: new Map(gqlTypes),
+ queryListFields
+ };
+}
+
+interface GetCollectionQueryArgs {
+ visits?: number;
+ visited?: Record;
+ depth?: number;
+}
+
+function getCollectionQuery(
+ collectionName: string,
+ gqlTypes: Map,
+ { visits = 2, depth = Infinity, visited = {} }: GetCollectionQueryArgs
+): string {
+ const collection = gqlTypes.get(collectionName);
+
+ // TODO: fields that exist in schema but not in graphql fail because they don't have field.type
+
+ return (
+ collection?.fields
+ .map((field) => {
+ if (field.type.kind === 'SCALAR' || field.type.ofType?.kind === 'SCALAR') return field.name;
+ const kind: string = field.type.kind === 'LIST' ? field.type.ofType.name : field.type.name;
+ depth--;
+ if (depth < 0) return '';
+ if (visited[kind] > visits) return '';
+ visited[kind] = (visited[kind] ?? 0) + 1;
+ return `${field.name} { ${getCollectionQuery(kind, gqlTypes, {
+ depth,
+ visited,
+ visits
+ })} }`;
+ })
+ .join(' ') ?? ''
+ );
+}
+
+function getFilter(filter: any) {
+ if (!filter) return '';
+ return `(filter: ${filter})`;
+}
+
+interface QueryCollectionArgs extends GetCollectionQueryArgs {
+ query: string;
+ collection: string;
+ filter?: any;
+}
+
+export async function queryCollection(args: QueryCollectionArgs, gqlTypes: Map) {
+ const { query, collection, filter, ...rest } = args;
+ const gqlQuery = `{
+ ${query}${getFilter(filter)} {
+ ${getCollectionQuery(collection, gqlTypes, rest)}
+ }
+ }
+ `;
+ const results = await api.post({ query: gqlQuery }).json();
+ return results.data[args.query];
+}
diff --git a/packages/editor/src/lib/breadcrumbs.svelte b/packages/editor/src/lib/breadcrumbs.svelte
new file mode 100644
index 00000000..86f1cad0
--- /dev/null
+++ b/packages/editor/src/lib/breadcrumbs.svelte
@@ -0,0 +1,51 @@
+
+
+
+ {#if allowBack}
+ c.path).path}
+ >
+
+
+ {/if}
+ {#each breadcrumbs as crumb}
+ {#if crumb.path}
+ {crumb.label}
+ {:else}
+ {crumb.label}
+ {/if}
+ {/each}
+
+
+
diff --git a/packages/editor/src/lib/config.ts b/packages/editor/src/lib/config.ts
new file mode 100644
index 00000000..5194ace9
--- /dev/null
+++ b/packages/editor/src/lib/config.ts
@@ -0,0 +1,86 @@
+import yaml from 'js-yaml';
+import { isArray, isEqual, keyBy, merge, mergeWith } from 'lodash-es';
+import crypto from 'node:crypto';
+import fs from 'node:fs/promises';
+import path from 'node:path';
+import type { GqlSchema, Schema } from './types';
+
+function replacer(key, value) {
+ if (key === 'type') return undefined;
+ if (value === null) return undefined;
+ if (value === '') return undefined;
+ if (key === 'disabled' && value === false) return undefined;
+ return value;
+}
+
+// TODO: capture
+interface Field {
+ label: string;
+ name: string;
+ description: string;
+ component: string;
+}
+
+export default class Config {
+ static getPath(schema: GqlSchema) {
+ return path.resolve(
+ process.cwd(),
+ '.flatbread',
+ 'schemas',
+ `${schema.name
+ .replace(/([A-Z])/g, '-$1')
+ .replace(/^\-/, '')
+ .toLowerCase()}.yaml`
+ );
+ }
+ static async exists(schema: GqlSchema) {
+ try {
+ return await fs.stat(this.getPath(schema));
+ } catch (e) {
+ console.log('does not exist');
+ return false;
+ }
+ }
+
+ static async get(collectionName: string, schema: Schema) {
+ let existing;
+ let filePath = this.getPath(schema);
+
+ //if the file exists load it and merge the fresh graphql schema into it
+ if (await this.exists(schema)) {
+ const file = await fs.readFile(filePath, 'utf-8');
+ existing = yaml.load(file);
+
+ schema = mergeWith(schema, existing, function (a, b) {
+ if (isArray(a)) {
+ const aMap = new Map(a.map((a) => [a.name, a]));
+ return b
+ .map((field: Field) => {
+ const cur = aMap.get(field.name);
+ if (!cur) return;
+ aMap.delete(field.name);
+ return merge(cur, field);
+ })
+ .concat(...aMap.values());
+ }
+ });
+ } else {
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
+ }
+
+ // attach a meta tag and get an accurate hash for caching
+ const meta = schema.meta ?? {};
+ schema.meta = undefined;
+ meta.hash = crypto.createHmac('sha1', JSON.stringify(schema)).digest('base64');
+ schema.meta = meta;
+
+ // if the hash doesn't match the file hash, update it
+ if (!isEqual(existing?.meta?.hash, schema?.meta?.hash)) {
+ console.log('writing config', collectionName);
+
+ await fs.writeFile(filePath, yaml.dump(schema, { flowLevel: 3, replacer }), 'utf-8');
+ }
+
+ return schema;
+ }
+}
diff --git a/packages/editor/src/lib/field-component.svelte b/packages/editor/src/lib/field-component.svelte
new file mode 100644
index 00000000..e9995c17
--- /dev/null
+++ b/packages/editor/src/lib/field-component.svelte
@@ -0,0 +1,17 @@
+
+
+{#if !field.hidden}
+
+{/if}
diff --git a/packages/editor/src/lib/fields/date.svelte b/packages/editor/src/lib/fields/date.svelte
new file mode 100644
index 00000000..6f669855
--- /dev/null
+++ b/packages/editor/src/lib/fields/date.svelte
@@ -0,0 +1,15 @@
+
+
+
diff --git a/packages/editor/src/lib/fields/float.svelte b/packages/editor/src/lib/fields/float.svelte
new file mode 100644
index 00000000..87d0edf2
--- /dev/null
+++ b/packages/editor/src/lib/fields/float.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/packages/editor/src/lib/fields/int.svelte b/packages/editor/src/lib/fields/int.svelte
new file mode 100644
index 00000000..87d0edf2
--- /dev/null
+++ b/packages/editor/src/lib/fields/int.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/packages/editor/src/lib/fields/list.svelte b/packages/editor/src/lib/fields/list.svelte
new file mode 100644
index 00000000..3853f8ad
--- /dev/null
+++ b/packages/editor/src/lib/fields/list.svelte
@@ -0,0 +1,26 @@
+
+
+
+ {field.label}
+ {#if field.description}{field.description}{/if}
+
+ {#each items as value}
+
+
+
+ {/each}
+
+
diff --git a/packages/editor/src/lib/fields/object.svelte b/packages/editor/src/lib/fields/object.svelte
new file mode 100644
index 00000000..018b8fb4
--- /dev/null
+++ b/packages/editor/src/lib/fields/object.svelte
@@ -0,0 +1,93 @@
+
+
+
+{#if value}
+
+
+ {#if !isRoot}
+ {#if !inList}
+ {field?.label}
+ {:else}
+ {get(value, collection.referenceField)}
+ {/if}
+ {/if}
+
+ {#if !inList && field.description}{field.description}{/if}
+
+ {#each editableFields as field}
+ {#if !field.hidden}
+ {#if field.component === 'object'}
+
+ {:else}
+
+ {/if}
+ {/if}
+ {/each}
+ {#if disabledFields.length > 0}
+
+ Show disabled fields
+
+ {#each disabledFields as field}
+ {#if field.component === 'object'}
+
+ {:else}
+
+ {/if}
+ {/each}
+
+
+ {/if}
+
+
+{/if}
+
+
diff --git a/packages/editor/src/lib/fields/raw.svelte b/packages/editor/src/lib/fields/raw.svelte
new file mode 100644
index 00000000..3598dd8c
--- /dev/null
+++ b/packages/editor/src/lib/fields/raw.svelte
@@ -0,0 +1,22 @@
+
+
+
diff --git a/packages/editor/src/lib/fields/string.svelte b/packages/editor/src/lib/fields/string.svelte
new file mode 100644
index 00000000..613b9c35
--- /dev/null
+++ b/packages/editor/src/lib/fields/string.svelte
@@ -0,0 +1,16 @@
+
+
+
diff --git a/packages/editor/src/lib/fields/svimg.svelte b/packages/editor/src/lib/fields/svimg.svelte
new file mode 100644
index 00000000..62ad22be
--- /dev/null
+++ b/packages/editor/src/lib/fields/svimg.svelte
@@ -0,0 +1,28 @@
+
+
+
diff --git a/packages/editor/src/lib/header.svelte b/packages/editor/src/lib/header.svelte
new file mode 100644
index 00000000..45796419
--- /dev/null
+++ b/packages/editor/src/lib/header.svelte
@@ -0,0 +1,63 @@
+
+
+
+
+
diff --git a/packages/editor/src/lib/preferences.ts b/packages/editor/src/lib/preferences.ts
new file mode 100644
index 00000000..e69de29b
diff --git a/packages/editor/src/lib/schema.ts b/packages/editor/src/lib/schema.ts
new file mode 100644
index 00000000..0f3a56ee
--- /dev/null
+++ b/packages/editor/src/lib/schema.ts
@@ -0,0 +1,66 @@
+import { capitalize } from 'lodash-es';
+import type { Field, GqlField, GqlSchema, GqlType, Schema } from './types';
+
+export function getComponentType(type: GqlType) {
+ const { kind, name } = type;
+ if (kind === 'SCALAR') return name.toLowerCase();
+ return kind.toLowerCase();
+}
+
+export function getNameFromLabel(label?: string) {
+ if (!label) return '';
+ return label
+ .replace(/^all/, '')
+ .replace(/([A-Z])/g, ' $1')
+ .trim();
+}
+
+// sort specific fields higher than the rest, in order
+const fieldSortWeights = ['name', 'title'];
+
+function weightedSort(a: string, b: string) {
+ const aw = fieldSortWeights.indexOf(a);
+ const bw = fieldSortWeights.indexOf(b);
+ if (aw < 0 && bw < 0) return undefined;
+ return fieldSortWeights.length - aw - (fieldSortWeights.length - bw);
+}
+
+export function transformSchema(schema: GqlSchema, querySchemaFieldMap: Record) {
+ const fields: Field[] =
+ schema.fields
+ ?.map((field: GqlField): Field => {
+ return {
+ label: capitalize(field.name.replace(/_+/g, ' ').trim()),
+ name: field.name,
+ description: field.description,
+ type: field.type,
+ disabled: field.name.startsWith('_') || field.name === 'id',
+ component: getComponentType(field.type),
+ collection: field.type.kind === 'OBJECT' ? field.type.name : undefined
+ };
+ })
+ .sort((a: Field, b: Field) => {
+ if (a.disabled && !b.disabled) return 1;
+ if (!a.disabled && b.disabled) return -1;
+ if (a.type.kind !== 'SCALAR' && b.type.kind === 'SCALAR') return 1;
+ if (a.type.kind === 'SCALAR' && b.type.kind !== 'SCALAR') return -1;
+
+ return (
+ weightedSort(a.name.toLowerCase(), b.name.toLowerCase()) ?? a.name.localeCompare(b.name)
+ );
+ }) || [];
+
+ const referenceField =
+ ['name', 'title'].find((fieldName) => fields.find((field) => field.name === fieldName)) ?? 'id';
+
+ const result: Schema = {
+ ...schema,
+ component: schema.kind.toLowerCase(),
+ label: getNameFromLabel(schema.name),
+ pluralName: getNameFromLabel(querySchemaFieldMap[schema.name]?.name),
+ referenceField,
+ fields
+ };
+
+ return result;
+}
diff --git a/packages/editor/src/lib/schemaStore.ts b/packages/editor/src/lib/schemaStore.ts
new file mode 100644
index 00000000..c4fe435f
--- /dev/null
+++ b/packages/editor/src/lib/schemaStore.ts
@@ -0,0 +1,4 @@
+import { writable } from 'svelte/store';
+
+export const gqlTypesStore = writable(new Map());
+export const queryTypesStore = writable(new Map());
diff --git a/packages/editor/src/lib/types.ts b/packages/editor/src/lib/types.ts
new file mode 100644
index 00000000..02e2d9b6
--- /dev/null
+++ b/packages/editor/src/lib/types.ts
@@ -0,0 +1,51 @@
+export interface GqlType {
+ kind: string;
+ name: string;
+}
+
+export interface GqlField {
+ name: string;
+ description?: string;
+ type: GqlType & { ofType?: GqlType };
+}
+
+export interface GqlSchema {
+ name: string;
+ pluralName: string;
+ description?: string;
+ kind: string;
+ fields: GqlField[];
+}
+
+export interface Field extends GqlField {
+ label: string;
+ disabled?: boolean;
+ component: string;
+ collection?: string;
+}
+
+export interface Schema extends GqlSchema {
+ fields: Field[];
+ pluralName: string;
+ component: string;
+ label: string;
+ referenceField: string;
+}
+
+export interface QueryCollection extends GqlField {
+ schema: Schema;
+ label: string;
+}
+
+export interface Session {
+ queryTypes: Map;
+ gqlTypes: Map;
+}
+
+export function isField(obj: Field | GqlSchema): obj is Field {
+ return Object.hasOwn(obj, 'type') && !Object.hasOwn(obj, 'fields');
+}
+
+export function isGqlSchema(obj: Field | GqlSchema): obj is GqlSchema {
+ return !Object.hasOwn(obj, 'type') && Object.hasOwn(obj, 'fields');
+}
diff --git a/packages/editor/src/lib/utils.ts b/packages/editor/src/lib/utils.ts
new file mode 100644
index 00000000..ba3fd31a
--- /dev/null
+++ b/packages/editor/src/lib/utils.ts
@@ -0,0 +1,11 @@
+import { getStores } from '$app/stores';
+import type { Session } from '$lib/types';
+import { get } from 'svelte/store';
+
+export function getSession() {
+ return get(getStores().session) as Session;
+}
+
+export function sanitizeGlobImport([key, value]: [string, any]) {
+ return [key.replace(/^.*\//, '').replace(/\..*$/, ''), value.default];
+}
diff --git a/packages/editor/src/routes/__layout.svelte b/packages/editor/src/routes/__layout.svelte
new file mode 100644
index 00000000..cd84a705
--- /dev/null
+++ b/packages/editor/src/routes/__layout.svelte
@@ -0,0 +1,105 @@
+
+
+
+
+
+
diff --git a/packages/editor/src/routes/collection/[name]/[id].svelte b/packages/editor/src/routes/collection/[name]/[id].svelte
new file mode 100644
index 00000000..0c93ee31
--- /dev/null
+++ b/packages/editor/src/routes/collection/[name]/[id].svelte
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+ Edit {querySchema.schema.label}
+
+
diff --git a/packages/editor/src/routes/collection/[name]/index.svelte b/packages/editor/src/routes/collection/[name]/index.svelte
new file mode 100644
index 00000000..fdb827ec
--- /dev/null
+++ b/packages/editor/src/routes/collection/[name]/index.svelte
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+ {collection.pluralName}
+
+
+ {#each visibleFields as field}
+ {field.label}
+ {/each}
+
+ {#each results as row}
+ location.assign(`/collection/${querySchema.name}/${row.id}`)}
+ >
+ {#each visibleFields as field}
+
+
+
+ {/each}
+
+ {/each}
+
+
+
+
diff --git a/packages/editor/src/routes/collection/[name]/new.svelte b/packages/editor/src/routes/collection/[name]/new.svelte
new file mode 100644
index 00000000..72e6c486
--- /dev/null
+++ b/packages/editor/src/routes/collection/[name]/new.svelte
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/editor/src/routes/index.svelte b/packages/editor/src/routes/index.svelte
new file mode 100644
index 00000000..6ae23ab7
--- /dev/null
+++ b/packages/editor/src/routes/index.svelte
@@ -0,0 +1,22 @@
+
+
+
+
+ Welcome to Leaven
+
+ {#each Array.from(queryTypes.values()) as collection}
+
+
+
+ {collection.schema.pluralName}
+
+
+
+ {/each}
+
+
diff --git a/packages/editor/static/favicon.png b/packages/editor/static/favicon.png
new file mode 100644
index 00000000..825b9e65
Binary files /dev/null and b/packages/editor/static/favicon.png differ
diff --git a/packages/editor/svelte.config.js b/packages/editor/svelte.config.js
new file mode 100644
index 00000000..892f0c46
--- /dev/null
+++ b/packages/editor/svelte.config.js
@@ -0,0 +1,15 @@
+import adapter from '@sveltejs/adapter-auto';
+import preprocess from 'svelte-preprocess';
+
+/** @type {import('@sveltejs/kit').Config} */
+const config = {
+ // Consult https://github.com/sveltejs/svelte-preprocess
+ // for more information about preprocessors
+ preprocess: preprocess(),
+
+ kit: {
+ adapter: adapter()
+ }
+};
+
+export default config;
diff --git a/packages/editor/tsconfig.json b/packages/editor/tsconfig.json
new file mode 100644
index 00000000..51c4dc7d
--- /dev/null
+++ b/packages/editor/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "paths": {
+ "$lib": ["src/lib"],
+ "$lib/*": ["src/lib/*"]
+ }
+ }
+}
diff --git a/packages/editor/vite.config.js b/packages/editor/vite.config.js
new file mode 100644
index 00000000..87470505
--- /dev/null
+++ b/packages/editor/vite.config.js
@@ -0,0 +1,8 @@
+import { sveltekit } from '@sveltejs/kit/vite';
+
+/** @type {import('vite').UserConfig} */
+const config = {
+ plugins: [sveltekit()]
+};
+
+export default config;
diff --git a/packages/flatbread/README.md b/packages/flatbread/README.md
index 1447a96f..54f813cb 100644
--- a/packages/flatbread/README.md
+++ b/packages/flatbread/README.md
@@ -83,6 +83,10 @@ export default defineConfig({
{
path: 'content/authors',
collection: 'Author',
+ // the field to use as the primary key, 'id' by default
+ referenceField: 'id',
+ // a list of fields that are required when creating a new record (mostly used by plugins)
+ creationRequiredFields: []
refs: {
friend: 'Author',
},
diff --git a/packages/flatbread/content/authors/me.md b/packages/flatbread/content/authors/me.md
index 408dc67d..200f7328 100644
--- a/packages/flatbread/content/authors/me.md
+++ b/packages/flatbread/content/authors/me.md
@@ -8,7 +8,7 @@ enjoys:
- making this
date_joined: 2021-02-25T16:41:59.558Z
skills:
- sitting: 204
+ sitting: 71
breathing: 7.07
liquid_consumption: 100
existence: simulation
diff --git a/packages/resolver-svimg/src/index.ts b/packages/resolver-svimg/src/index.ts
index 27fd8284..f2008cb7 100644
--- a/packages/resolver-svimg/src/index.ts
+++ b/packages/resolver-svimg/src/index.ts
@@ -24,6 +24,9 @@ type Svimg {
"""Aspect ratio of image"""
aspectratio: Float
+
+ """The raw value supplied from config"""
+ raw: String
}`;
/**
@@ -37,9 +40,12 @@ export function createSvImgField(field: string, config: Omit) {
return {
field,
type: SVIMG_TYPE,
- resolve(src: string) {
+ async resolve(src: string) {
if (!src) return null;
- return generateComponentAttributes({ queue, ...config, src });
+ return {
+ ...(await generateComponentAttributes({ queue, ...config, src })),
+ raw: src,
+ };
},
};
}
diff --git a/packages/source-filesystem/package.json b/packages/source-filesystem/package.json
index d8e42ded..b124a572 100644
--- a/packages/source-filesystem/package.json
+++ b/packages/source-filesystem/package.json
@@ -38,6 +38,7 @@
},
"devDependencies": {
"@flatbread/core": "workspace:*",
+ "@sindresorhus/slugify": "^2.1.0",
"@types/lodash-es": "4.17.6",
"@types/node": "16.11.47",
"tsup": "6.2.1",
diff --git a/packages/source-filesystem/src/index.test.ts b/packages/source-filesystem/src/index.test.ts
new file mode 100644
index 00000000..6af017b8
--- /dev/null
+++ b/packages/source-filesystem/src/index.test.ts
@@ -0,0 +1,40 @@
+import test from 'ava';
+import { createPath } from './index';
+
+test('create path can correctly populate a path', (t) => {
+ const path = createPath(
+ {
+ name: 'Test',
+ path: '/[test]/[nested.test]/[blah].md',
+ },
+ {
+ test: 'first',
+ nested: {
+ test: 'second-part',
+ },
+ blah: 'blarghhh',
+ },
+ { extension: '' }
+ );
+
+ t.is(path, '/first/second-part/blarghhh.md');
+});
+
+test('create path can correctly populate a path without an extension', (t) => {
+ const path = createPath(
+ {
+ name: 'Test',
+ path: '/[test]/[nested.test]/[blah]',
+ },
+ {
+ test: 'first',
+ nested: {
+ test: 'second-part',
+ },
+ blah: 'blarghhh',
+ },
+ { extension: '.md', reference: 'test-name', referenceField: 'id' }
+ );
+
+ t.is(path, '/first/second-part/blarghhh/test-name.md');
+});
diff --git a/packages/source-filesystem/src/index.ts b/packages/source-filesystem/src/index.ts
index 461cf0d2..b4787607 100644
--- a/packages/source-filesystem/src/index.ts
+++ b/packages/source-filesystem/src/index.ts
@@ -1,7 +1,13 @@
-import { defaultsDeep } from 'lodash-es';
-import { read } from 'to-vfile';
-
-import type { LoadedFlatbreadConfig, SourcePlugin } from '@flatbread/core';
+import type {
+ CollectionEntry,
+ FlatbreadArgs,
+ LoadedCollectionEntry,
+ LoadedFlatbreadConfig,
+} from '@flatbread/core';
+import slugify from '@sindresorhus/slugify';
+import { defaultsDeep, get } from 'lodash-es';
+import path, { relative, resolve } from 'path';
+import { read, write } from 'to-vfile';
import type { VFile } from 'vfile';
import type {
FileNode,
@@ -10,6 +16,12 @@ import type {
} from './types';
import gatherFileNodes from './utils/gatherFileNodes';
+interface Context {
+ filename?: string;
+ path: string;
+ slug: string;
+}
+
/**
* Get nodes (files) from the directory
*
@@ -18,17 +30,30 @@ import gatherFileNodes from './utils/gatherFileNodes';
* @returns An array of content nodes
*/
async function getNodesFromDirectory(
- path: string,
+ collectionEntry: LoadedCollectionEntry,
+ { addRecord, addCreationRequiredFields }: FlatbreadArgs,
config: InitializedSourceFilesystemConfig
-): Promise {
+): Promise {
const { extensions } = config;
- const nodes: FileNode[] = await gatherFileNodes(path, { extensions });
+ const nodes: FileNode[] = await gatherFileNodes(collectionEntry.path, {
+ extensions,
+ });
- return Promise.all(
- nodes.map(async (node: FileNode): Promise => {
- const file = await read(node.path);
- file.data = node.data;
- return file;
+ // collect all the variable path segments [like] [these]
+ const requiredFields = Array.from(
+ collectionEntry.path.matchAll(/\[(.*?)\]/g)
+ ).map((m) => m[1]);
+ addCreationRequiredFields(collectionEntry, requiredFields);
+
+ await Promise.all(
+ nodes.map(async (node: FileNode): Promise => {
+ const doc = await read(node.path);
+ doc.data = node.data;
+ addRecord(collectionEntry, doc, {
+ filename: doc.basename,
+ path: relative(process.cwd(), doc.path),
+ slug: slugify(doc.stem ?? ''),
+ });
})
);
}
@@ -40,26 +65,57 @@ async function getNodesFromDirectory(
* @returns
*/
async function getAllNodes(
- allContentTypes: Record[],
+ allCollectionEntries: LoadedCollectionEntry[],
+ flatbread: FlatbreadArgs,
config: InitializedSourceFilesystemConfig
-): Promise> {
- const nodeEntries = await Promise.all(
- allContentTypes.map(
+): Promise {
+ await Promise.all(
+ allCollectionEntries.map(
async (contentType): Promise> =>
new Promise(async (res) =>
res([
- contentType.collection,
- await getNodesFromDirectory(contentType.path, config),
+ contentType.name,
+ await getNodesFromDirectory(contentType, flatbread, config),
])
)
)
);
+}
- const nodes = Object.fromEntries(
- nodeEntries as Iterable
+export function createPath(
+ collection: CollectionEntry,
+ record: any,
+ parentContext: any
+): string {
+ const partialPath = collection.path.replace(
+ /\[(.*?)\]/g,
+ (_: any, match: any) => get(record, match)
);
- return nodes;
+ const filename = path.parse(partialPath);
+
+ if (!filename.ext) {
+ return resolve(
+ partialPath,
+ parentContext.reference + parentContext.extension
+ );
+ }
+
+ return partialPath;
+}
+
+async function put(
+ doc: VFile,
+ context: Context,
+ { parentContext, collection, record }: any
+) {
+ const path = context?.path ?? createPath(collection, record, parentContext);
+ doc.basename = context?.filename ?? parentContext.reference;
+ doc.path = resolve(process.cwd(), path);
+
+ await write(doc);
+
+ return { doc, context };
}
/**
@@ -68,7 +124,8 @@ async function getAllNodes(
* @param sourceConfig content types config
* @returns A function that returns functions which fetch lists of nodes
*/
-export const source: SourcePlugin = (sourceConfig?: sourceFilesystemConfig) => {
+
+export function source(sourceConfig?: sourceFilesystemConfig) {
let config: InitializedSourceFilesystemConfig;
return {
@@ -76,10 +133,12 @@ export const source: SourcePlugin = (sourceConfig?: sourceFilesystemConfig) => {
const { extensions } = flatbreadConfig.loaded;
config = defaultsDeep(sourceConfig ?? {}, { extensions });
},
- fetchByType: (path: string) => getNodesFromDirectory(path, config),
- fetch: (allContentTypes: Record[]) =>
- getAllNodes(allContentTypes, config),
+ fetch: (
+ content: LoadedCollectionEntry[],
+ flatbread: FlatbreadArgs
+ ) => getAllNodes(content, flatbread, config),
+ put,
};
-};
+}
export default source;
diff --git a/packages/source-filesystem/src/utils/gatherFileNodes.ts b/packages/source-filesystem/src/utils/gatherFileNodes.ts
index 8f880636..a4bdf664 100644
--- a/packages/source-filesystem/src/utils/gatherFileNodes.ts
+++ b/packages/source-filesystem/src/utils/gatherFileNodes.ts
@@ -41,6 +41,11 @@ export default async function gatherFileNodes(
path: string,
{ readDirectory = readDir, extensions }: GatherFileNodesOptions = {}
): Promise {
+ if (path.includes('*'))
+ throw new Error(
+ `* wildcards are not supported, only variable named paths like [example]\nPlease change path in config "${path}"`
+ );
+
/**
* Prepend a period to the extension if it doesn't have one.
* If no extensions are provided, use the default ones.
@@ -51,7 +56,7 @@ export default async function gatherFileNodes(
) ?? ['.md', '.mdx', '.markdown'];
// gather all the globs in the path ( [capture-groups], **, *)
- const [pathPrefix, ...globs] = path.split(/\/(?:\[|\*+)/);
+ const [pathPrefix, ...globs] = path.split(/\/(?:\[)/);
// for each segment - gather names for capture groups
// and calculate what to remove from matches ex: [name].md => remove .md from match
diff --git a/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts b/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts
index e9b2699c..67bc3134 100644
--- a/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts
+++ b/packages/source-filesystem/src/utils/tests/gatherFileNodes.test.ts
@@ -32,20 +32,20 @@ test('basic case', async (t) => {
t.snapshot(result2);
});
-test('double level recursion', async (t) => {
- const result = await gatherFileNodes('deeply/**/*.md', opts);
- t.snapshot(result);
-});
+// test('double level recursion', async (t) => {
+// const result = await gatherFileNodes('deeply/**/*.md', opts);
+// t.snapshot(result);
+// });
test('double level recursion named', async (t) => {
const result = await gatherFileNodes('deeply/[a]/[b].md', opts);
t.snapshot(result);
});
-test('single level recursion', async (t) => {
- const result = await gatherFileNodes('./*.md', opts as any);
- t.snapshot(result);
-});
+// test('single level recursion', async (t) => {
+// const result = await gatherFileNodes('./*.md', opts as any);
+// t.snapshot(result);
+// });
test('double level recursion named without parent directory', async (t) => {
const result = await gatherFileNodes('./[genre]/[title].md', opts);
@@ -57,15 +57,15 @@ test('single level named', async (t) => {
t.snapshot(result);
});
-test('double level first named', async (t) => {
- const result = await gatherFileNodes('./[genre]/*.md', opts);
- t.snapshot(result);
-});
+// test('double level first named', async (t) => {
+// const result = await gatherFileNodes('./[genre]/*.md', opts);
+// t.snapshot(result);
+// });
-test('double level second named', async (t) => {
- const result = await gatherFileNodes('./**/[title].md', opts);
- t.snapshot(result);
-});
+// test('double level second named', async (t) => {
+// const result = await gatherFileNodes('./**/[title].md', opts);
+// t.snapshot(result);
+// });
test('triple level', async (t) => {
const result = await gatherFileNodes('./[random]/[name]/[title].md', opts);
diff --git a/packages/source-filesystem/tsup.config.ts b/packages/source-filesystem/tsup.config.ts
index 24b848e6..fa78cb57 100644
--- a/packages/source-filesystem/tsup.config.ts
+++ b/packages/source-filesystem/tsup.config.ts
@@ -4,7 +4,7 @@ export const tsup: Options = {
splitting: false,
sourcemap: true,
clean: true,
- entryPoints: ['src/*'],
+ entryPoints: ['src/index.ts'],
format: ['esm'],
target: 'esnext',
dts: true,
diff --git a/packages/transformer-markdown/package.json b/packages/transformer-markdown/package.json
index c97d3800..3f6888ba 100644
--- a/packages/transformer-markdown/package.json
+++ b/packages/transformer-markdown/package.json
@@ -32,7 +32,6 @@
"node": "^14.13.1 || >=16.0.0"
},
"dependencies": {
- "@sindresorhus/slugify": "^2.1.0",
"graphql": "16.5.0",
"gray-matter": "^4.0.3",
"lodash-es": "^4.17.21",
diff --git a/packages/transformer-markdown/src/index.ts b/packages/transformer-markdown/src/index.ts
index 54d5a01a..eb8dd087 100644
--- a/packages/transformer-markdown/src/index.ts
+++ b/packages/transformer-markdown/src/index.ts
@@ -1,10 +1,14 @@
import matter from 'gray-matter';
-import slugify from '@sindresorhus/slugify';
-import { html, excerpt, timeToRead } from './graphql/schema-helpers';
+import { excerpt, html, timeToRead } from './graphql/schema-helpers';
+import ownPackage from '../package.json' assert { type: 'json' };
+import type {
+ CollectionContext,
+ EntryNode,
+ TransformerPlugin,
+} from '@flatbread/core';
+import { VFile } from 'vfile';
import type { MarkdownTransformerConfig } from './types';
-import type { EntryNode, TransformerPlugin } from '@flatbread/core';
-import type { VFile } from 'vfile';
export * from './types';
@@ -20,17 +24,27 @@ export const parse = (
): EntryNode => {
const { data, content } = matter(String(input), config.grayMatter);
return {
- _filename: input.basename,
- _path: input.path,
- _slug: slugify(input.stem ?? ''),
- ...input.data,
- ...data,
- _content: {
- raw: content,
+ record: {
+ ...input.data,
+ ...data,
+ _content: {
+ raw: content,
+ },
},
};
};
+function serialize(
+ data: EntryNode,
+ ctx: CollectionContext,
+ config: MarkdownTransformerConfig
+) {
+ const { _content, ...rest } = data;
+ const doc = matter.stringify(_content?.raw ?? '', rest, config.grayMatter);
+
+ return new VFile(doc);
+}
+
/**
* Converts markdown files to meaningful data.
*
@@ -45,6 +59,7 @@ export const transformer: TransformerPlugin = (
);
return {
parse: (input: VFile): EntryNode => parse(input, config),
+ id: ownPackage.name,
preknownSchemaFragments: () => ({
_content: {
html: html(config),
@@ -53,6 +68,8 @@ export const transformer: TransformerPlugin = (
},
}),
inspect: (input: EntryNode) => String(input),
+ serialize: (input: EntryNode, ctx: CollectionContext) =>
+ serialize(input, ctx, config),
extensions,
};
};
diff --git a/packages/transformer-yaml/package.json b/packages/transformer-yaml/package.json
index 761722e4..0857c7de 100644
--- a/packages/transformer-yaml/package.json
+++ b/packages/transformer-yaml/package.json
@@ -32,7 +32,6 @@
"node": "^14.13.1 || >=16.0.0"
},
"dependencies": {
- "@sindresorhus/slugify": "^2.1.0",
"js-yaml": "^4.1.0"
},
"devDependencies": {
diff --git a/packages/transformer-yaml/src/index.ts b/packages/transformer-yaml/src/index.ts
index f5b36ed3..b16cf861 100644
--- a/packages/transformer-yaml/src/index.ts
+++ b/packages/transformer-yaml/src/index.ts
@@ -1,8 +1,12 @@
-import yaml from 'js-yaml';
+import type {
+ CollectionContext,
+ EntryNode,
+ TransformerPlugin,
+} from '@flatbread/core';
import type { YAMLException } from 'js-yaml';
-import slugify from '@sindresorhus/slugify';
-import type { EntryNode, TransformerPlugin } from '@flatbread/core';
-import type { VFile } from 'vfile';
+import yaml from 'js-yaml';
+import { VFile } from 'vfile';
+import ownPackage from '../package.json' assert { type: 'json' };
/**
* Transforms a yaml file (content node) to JSON.
@@ -18,11 +22,10 @@ export const parse = (input: VFile): EntryNode => {
if (typeof doc === 'object') {
return {
- _filename: input.basename,
- _path: input.path,
- _slug: slugify(input.stem ?? ''),
- ...input.data,
- ...doc,
+ record: {
+ ...input.data,
+ ...doc,
+ },
};
}
throw new Error(
@@ -32,15 +35,22 @@ export const parse = (input: VFile): EntryNode => {
);
};
+function serialize(node: EntryNode, ctx: CollectionContext): VFile {
+ const doc = yaml.dump(node);
+ return new VFile(doc);
+}
+
/**
- * Converts markdown files to meaningful data.
+ * Converts yaml files to meaningful data.
*
- * @returns Markdown parser, preknown GraphQL schema fragments, and an EntryNode inspector function.
+ * @returns yaml parser, preknown GraphQL schema fragments, and an EntryNode inspector function.
*/
export const transformer: TransformerPlugin = () => {
return {
parse: (input: VFile): EntryNode => parse(input),
inspect: (input: EntryNode) => String(input),
+ id: ownPackage.name,
+ serialize,
extensions: ['.yaml', '.yml'],
};
};
diff --git a/packages/transformer-yaml/src/tests/index.test.ts b/packages/transformer-yaml/src/tests/index.test.ts
index ba28b068..5246dee3 100644
--- a/packages/transformer-yaml/src/tests/index.test.ts
+++ b/packages/transformer-yaml/src/tests/index.test.ts
@@ -26,6 +26,6 @@ const transformer = Transformer();
test('it can parse a basic yaml file', async (t) => {
const parse = transformer.parse as (input: VFile) => EntryNode;
- const node = parse(testFile);
- t.snapshot(node);
+ const { record } = parse(testFile);
+ t.snapshot(record);
});
diff --git a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md
index 4174cf44..ee331630 100644
--- a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md
+++ b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.md
@@ -9,9 +9,6 @@ Generated by [AVA](https://avajs.dev).
> Snapshot 1
{
- _filename: undefined,
- _path: undefined,
- _slug: '',
date_joined: Date 2021-02-25 16:41:59 558ms UTC {},
enjoys: [
'cats',
diff --git a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap
index 8de1e400..b68787a8 100644
Binary files a/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap and b/packages/transformer-yaml/src/tests/snapshots/index.test.ts.snap differ
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 39bf7a95..809041ff 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -156,6 +156,7 @@ importers:
lodash-es: 4.17.21
lru-cache: 7.13.2
matcher: 5.0.0
+ nanoid: 4.0.0
plur: 5.1.0
tsup: 6.2.1
typescript: 4.7.4
@@ -167,6 +168,7 @@ importers:
lodash-es: 4.17.21
lru-cache: 7.13.2
matcher: 5.0.0
+ nanoid: 4.0.0
plur: 5.1.0
devDependencies:
'@types/lodash-es': 4.17.6
@@ -175,6 +177,59 @@ importers:
typescript: 4.7.4
vfile: 5.3.4
+ packages/editor:
+ specifiers:
+ '@picocss/pico': ^1.5.3
+ '@sveltejs/adapter-auto': next
+ '@sveltejs/kit': next
+ '@types/js-yaml': ^4.0.5
+ '@types/lodash-es': ^4.17.6
+ '@typescript-eslint/eslint-plugin': ^5.31.0
+ '@typescript-eslint/parser': ^5.31.0
+ eslint: ^8.20.0
+ eslint-config-prettier: ^8.5.0
+ eslint-plugin-svelte3: ^4.0.0
+ js-yaml: ^4.1.0
+ lodash-es: ^4.17.21
+ node-fetch: ^3.2.9
+ prettier: ^2.7.1
+ prettier-plugin-svelte: ^2.7.0
+ sass: ^1.54.0
+ svelte: ^3.49.0
+ svelte-check: ^2.8.0
+ svelte-preprocess: ^4.10.7
+ svimg: 3.1.0
+ tslib: ^2.4.0
+ typescript: ^4.7.4
+ vite: ^3.0.3
+ wretch: ^1.7.10
+ dependencies:
+ '@picocss/pico': 1.5.3
+ '@types/js-yaml': 4.0.5
+ '@types/lodash-es': 4.17.6
+ js-yaml: 4.1.0
+ lodash-es: 4.17.21
+ node-fetch: 3.2.10
+ svimg: 3.1.0
+ wretch: 1.7.10
+ devDependencies:
+ '@sveltejs/adapter-auto': 1.0.0-next.64
+ '@sveltejs/kit': 1.0.0-next.405_svelte@3.49.0+vite@3.0.4
+ '@typescript-eslint/eslint-plugin': 5.33.0_njno5y7ry2l2lcmiu4tywxkwnq
+ '@typescript-eslint/parser': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq
+ eslint: 8.21.0
+ eslint-config-prettier: 8.5.0_eslint@8.21.0
+ eslint-plugin-svelte3: 4.0.0_a7wk4ghvg4hia4trwaglu7p6cq
+ prettier: 2.7.1
+ prettier-plugin-svelte: 2.7.0_o3ioganyptcsrh6x4hnxvjkpqi
+ sass: 1.54.4
+ svelte: 3.49.0
+ svelte-check: 2.8.0_sass@1.54.4+svelte@3.49.0
+ svelte-preprocess: 4.10.7_5pbfnpqyf7t5aldaahu6bz5wwm
+ tslib: 2.4.0
+ typescript: 4.7.4
+ vite: 3.0.4_sass@1.54.4
+
packages/flatbread:
specifiers:
'@apollo/utils.keyvaluecache': ^1.0.1
@@ -251,6 +306,7 @@ importers:
packages/source-filesystem:
specifiers:
'@flatbread/core': workspace:*
+ '@sindresorhus/slugify': ^2.1.0
'@types/lodash-es': 4.17.6
'@types/node': 16.11.47
lodash-es: ^4.17.21
@@ -265,6 +321,7 @@ importers:
unified: 10.1.2
devDependencies:
'@flatbread/core': link:../core
+ '@sindresorhus/slugify': 2.1.0
'@types/lodash-es': 4.17.6
'@types/node': 16.11.47
tsup: 6.2.1_typescript@4.7.4
@@ -274,7 +331,6 @@ importers:
packages/transformer-markdown:
specifiers:
'@flatbread/core': workspace:*
- '@sindresorhus/slugify': ^2.1.0
'@types/node': 16.11.47
'@types/sanitize-html': 2.6.2
graphql: 16.5.0
@@ -304,7 +360,6 @@ importers:
unified: ^10.1.2
vfile: 5.3.4
dependencies:
- '@sindresorhus/slugify': 2.1.0
graphql: 16.5.0
gray-matter: 4.0.3
lodash-es: 4.17.21
@@ -339,7 +394,6 @@ importers:
packages/transformer-yaml:
specifiers:
'@flatbread/core': workspace:*
- '@sindresorhus/slugify': ^2.1.0
'@types/js-yaml': 4.0.5
'@types/node': 16.11.47
js-yaml: ^4.1.0
@@ -347,7 +401,6 @@ importers:
typescript: 4.7.4
vfile: 5.3.4
dependencies:
- '@sindresorhus/slugify': 2.1.0
js-yaml: 4.1.0
devDependencies:
'@flatbread/core': link:../core
@@ -818,6 +871,10 @@ packages:
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
dev: true
+ /@cloudflare/workers-types/3.14.1:
+ resolution: {integrity: sha512-B1/plF62pt+H2IJHvApK8fdOJAVsvojvacuac8x8s+JIyqbropMyqNqHTKLm3YD8ZFLGwYeFTudU+PQ7vGvBdA==}
+ dev: true
+
/@colors/colors/1.5.0:
resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
engines: {node: '>=0.1.90'}
@@ -859,7 +916,6 @@ packages:
cpu: [loong64]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/@eslint/eslintrc/0.4.3:
@@ -879,6 +935,23 @@ packages:
- supports-color
dev: true
+ /@eslint/eslintrc/1.3.0:
+ resolution: {integrity: sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.3.4
+ espree: 9.3.3
+ globals: 13.15.0
+ ignore: 5.2.0
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@graphql-tools/merge/8.3.0_graphql@16.5.0:
resolution: {integrity: sha512-xRa7RAQok/0DD2YnjuqikMrr7dUAxTpdGtZ7BkvUUGhYs3B3p7reCAfvOVr1DJAqVToP7hdlMk+S5+Ylk+AaqA==}
peerDependencies:
@@ -922,6 +995,17 @@ packages:
tslib: 2.4.0
dev: false
+ /@humanwhocodes/config-array/0.10.4:
+ resolution: {integrity: sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 1.2.1
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@humanwhocodes/config-array/0.5.0:
resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==}
engines: {node: '>=10.10.0'}
@@ -933,10 +1017,18 @@ packages:
- supports-color
dev: true
+ /@humanwhocodes/gitignore-to-minimatch/1.0.2:
+ resolution: {integrity: sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==}
+ dev: true
+
/@humanwhocodes/object-schema/1.2.1:
resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
dev: true
+ /@iarna/toml/2.2.5:
+ resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==}
+ dev: true
+
/@istanbuljs/load-nyc-config/1.1.0:
resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
engines: {node: '>=8'}
@@ -1165,6 +1257,24 @@ packages:
type-detect: 4.0.8
dev: true
+ /@mapbox/node-pre-gyp/1.0.9:
+ resolution: {integrity: sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==}
+ hasBin: true
+ dependencies:
+ detect-libc: 2.0.1
+ https-proxy-agent: 5.0.1
+ make-dir: 3.1.0
+ node-fetch: 2.6.7
+ nopt: 5.0.0
+ npmlog: 5.0.1
+ rimraf: 3.0.2
+ semver: 7.3.7
+ tar: 6.1.11
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
/@next/env/12.2.3:
resolution: {integrity: sha512-2lWKP5Xcvnor70NaaROZXBvU8z9mFReePCG8NhZw6NyNGnPvC+8s+Cre/63LAB1LKzWw/e9bZJnQUg0gYFRb2Q==}
dev: false
@@ -1464,6 +1574,10 @@ packages:
typescript: 4.7.4
dev: true
+ /@picocss/pico/1.5.3:
+ resolution: {integrity: sha512-ZdZOxjlmj0BkpGpYo/ODgAcFpqIgpAACqEmIgpFtxHkam06ITfUfcj9+mPcd+Ti8Dh0KCSvHpmSnJA3+tOStlQ==}
+ dev: false
+
/@protobufjs/aspromise/1.1.2:
resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
dev: false
@@ -1552,7 +1666,7 @@ packages:
dependencies:
'@sindresorhus/transliterate': 1.5.0
escape-string-regexp: 5.0.0
- dev: false
+ dev: true
/@sindresorhus/transliterate/1.5.0:
resolution: {integrity: sha512-/sfSkoNelLq5riqNRp5uBjHIKBi1MWZk9ubRT1WiBQuTfmDf7BeQkph2DJzRB83QagMPHk2VDjuvpy0VuwyzdA==}
@@ -1560,7 +1674,7 @@ packages:
dependencies:
escape-string-regexp: 5.0.0
lodash.deburr: 4.1.0
- dev: false
+ dev: true
/@sinonjs/commons/1.8.3:
resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==}
@@ -1574,10 +1688,48 @@ packages:
'@sinonjs/commons': 1.8.3
dev: true
+ /@sveltejs/adapter-auto/1.0.0-next.64:
+ resolution: {integrity: sha512-Q8DwcS6wl1GovzS9JJzaD/WL/Lfk1ur4nAF1HtmsUvZDpsPBVDqnK2AhYU4G3oFNiuHstrjAogMy5th8ptSFGw==}
+ dependencies:
+ '@sveltejs/adapter-cloudflare': 1.0.0-next.31
+ '@sveltejs/adapter-netlify': 1.0.0-next.71
+ '@sveltejs/adapter-vercel': 1.0.0-next.66
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
+ /@sveltejs/adapter-cloudflare/1.0.0-next.31:
+ resolution: {integrity: sha512-HhEFZP72GJ8AZGgFECKIiayDcLaAWi65pI0AnBfiNhCifYSlH/mPNWNVD4AWRDnXnH6XU+FLwhGDnIDwytTyYg==}
+ dependencies:
+ '@cloudflare/workers-types': 3.14.1
+ esbuild: 0.14.53
+ worktop: 0.8.0-next.14
+ dev: true
+
+ /@sveltejs/adapter-netlify/1.0.0-next.71:
+ resolution: {integrity: sha512-la1CGtWO1xul1L3zEoFAoc4EX2uxZjrZcOMS3tkKB8drxhbQsNbnTE6fmSSMFiZXhxaikczrBgQwqIaDkLTmZg==}
+ dependencies:
+ '@iarna/toml': 2.2.5
+ esbuild: 0.14.53
+ set-cookie-parser: 2.5.1
+ tiny-glob: 0.2.9
+ dev: true
+
/@sveltejs/adapter-static/1.0.0-next.39:
resolution: {integrity: sha512-EeD39H6iEe0UEKnKxLFTZFZpi/FcX5xfbAvsMQ+B09aDZccpQmkJBSIo+4kq1JsQGSjwi/+J3aE9bR67R6CIyQ==}
dev: true
+ /@sveltejs/adapter-vercel/1.0.0-next.66:
+ resolution: {integrity: sha512-s3Hcxu9nCG/rR3C3cFbdQGjTa5W4K2kRcc6S5Xefx7itbrw+4v3KpO8ZPB6qM55XDwVxuG7260NMHVI6MUGmSA==}
+ dependencies:
+ '@vercel/nft': 0.21.0
+ esbuild: 0.14.53
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
/@sveltejs/kit/1.0.0-next.405_svelte@3.49.0+vite@3.0.4:
resolution: {integrity: sha512-jHSa74F7k+hC+0fof75g/xm/+1M5sM66Qt6v8eLLMSgjkp36Lb5xOioBhbl6w0NYoE5xysLsBWuu+yHytfvCBA==}
engines: {node: '>=16.9'}
@@ -1592,7 +1744,7 @@ packages:
sade: 1.8.1
svelte: 3.49.0
tiny-glob: 0.2.9
- vite: 3.0.4
+ vite: 3.0.4_sass@1.54.4
transitivePeerDependencies:
- diff-match-patch
- supports-color
@@ -1616,7 +1768,7 @@ packages:
magic-string: 0.26.2
svelte: 3.49.0
svelte-hmr: 0.14.12_svelte@3.49.0
- vite: 3.0.4
+ vite: 3.0.4_sass@1.54.4
transitivePeerDependencies:
- supports-color
dev: true
@@ -1765,7 +1917,6 @@ packages:
/@types/js-yaml/4.0.5:
resolution: {integrity: sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==}
- dev: true
/@types/json-schema/7.0.11:
resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
@@ -1779,11 +1930,9 @@ packages:
resolution: {integrity: sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==}
dependencies:
'@types/lodash': 4.14.182
- dev: true
/@types/lodash/4.14.182:
resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==}
- dev: true
/@types/long/4.0.2:
resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==}
@@ -1959,6 +2108,33 @@ packages:
- supports-color
dev: true
+ /@typescript-eslint/eslint-plugin/5.33.0_njno5y7ry2l2lcmiu4tywxkwnq:
+ resolution: {integrity: sha512-jHvZNSW2WZ31OPJ3enhLrEKvAZNyAFWZ6rx9tUwaessTc4sx9KmgMNhVcqVAl1ETnT5rU5fpXTLmY9YvC1DCNg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/parser': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq
+ '@typescript-eslint/scope-manager': 5.33.0
+ '@typescript-eslint/type-utils': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq
+ '@typescript-eslint/utils': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq
+ debug: 4.3.4
+ eslint: 8.21.0
+ functional-red-black-tree: 1.0.1
+ ignore: 5.2.0
+ regexpp: 3.2.0
+ semver: 7.3.7
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/experimental-utils/4.33.0_hxadhbs2xogijvk7vq4t2azzbu:
resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -2017,6 +2193,26 @@ packages:
- supports-color
dev: true
+ /@typescript-eslint/parser/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq:
+ resolution: {integrity: sha512-cgM5cJrWmrDV2KpvlcSkelTBASAs1mgqq+IUGKJvFxWrapHpaRy5EXPQz9YaKF3nZ8KY18ILTiVpUtbIac86/w==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.33.0
+ '@typescript-eslint/types': 5.33.0
+ '@typescript-eslint/typescript-estree': 5.33.0_typescript@4.7.4
+ debug: 4.3.4
+ eslint: 8.21.0
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/scope-manager/4.33.0:
resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==}
engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
@@ -2033,6 +2229,33 @@ packages:
'@typescript-eslint/visitor-keys': 5.30.7
dev: true
+ /@typescript-eslint/scope-manager/5.33.0:
+ resolution: {integrity: sha512-/Jta8yMNpXYpRDl8EwF/M8It2A9sFJTubDo0ATZefGXmOqlaBffEw0ZbkbQ7TNDK6q55NPHFshGBPAZvZkE8Pw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.33.0
+ '@typescript-eslint/visitor-keys': 5.33.0
+ dev: true
+
+ /@typescript-eslint/type-utils/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq:
+ resolution: {integrity: sha512-2zB8uEn7hEH2pBeyk3NpzX1p3lF9dKrEbnXq1F7YkpZ6hlyqb2yZujqgRGqXgRBTHWIUG3NGx/WeZk224UKlIA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/utils': 5.33.0_qugx7qdu5zevzvxaiqyxfiwquq
+ debug: 4.3.4
+ eslint: 8.21.0
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
/@typescript-eslint/types/4.33.0:
resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==}
engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
@@ -2043,6 +2266,11 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
+ /@typescript-eslint/types/5.33.0:
+ resolution: {integrity: sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
/@typescript-eslint/typescript-estree/4.33.0_typescript@4.7.4:
resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==}
engines: {node: ^10.12.0 || >=12.0.0}
@@ -2085,6 +2313,45 @@ packages:
- supports-color
dev: true
+ /@typescript-eslint/typescript-estree/5.33.0_typescript@4.7.4:
+ resolution: {integrity: sha512-tqq3MRLlggkJKJUrzM6wltk8NckKyyorCSGMq4eVkyL5sDYzJJcMgZATqmF8fLdsWrW7OjjIZ1m9v81vKcaqwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 5.33.0
+ '@typescript-eslint/visitor-keys': 5.33.0
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ semver: 7.3.7
+ tsutils: 3.21.0_typescript@4.7.4
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils/5.33.0_qugx7qdu5zevzvxaiqyxfiwquq:
+ resolution: {integrity: sha512-JxOAnXt9oZjXLIiXb5ZIcZXiwVHCkqZgof0O8KPgz7C7y0HS42gi75PdPlqh1Tf109M0fyUw45Ao6JLo7S5AHw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@types/json-schema': 7.0.11
+ '@typescript-eslint/scope-manager': 5.33.0
+ '@typescript-eslint/types': 5.33.0
+ '@typescript-eslint/typescript-estree': 5.33.0_typescript@4.7.4
+ eslint: 8.21.0
+ eslint-scope: 5.1.1
+ eslint-utils: 3.0.0_eslint@8.21.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
/@typescript-eslint/visitor-keys/4.33.0:
resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==}
engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
@@ -2101,10 +2368,42 @@ packages:
eslint-visitor-keys: 3.3.0
dev: true
+ /@typescript-eslint/visitor-keys/5.33.0:
+ resolution: {integrity: sha512-/XsqCzD4t+Y9p5wd9HZiptuGKBlaZO5showwqODii5C0nZawxWLF+Q6k5wYHBrQv96h6GYKyqqMHCSTqta8Kiw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ '@typescript-eslint/types': 5.33.0
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
+ /@vercel/nft/0.21.0:
+ resolution: {integrity: sha512-hFCAETfI5cG8l5iAiLhMC2bReC5K7SIybzrxGorv+eGspIbIFsVw7Vg85GovXm/LxA08pIDrAlrhR6GN36XB/Q==}
+ hasBin: true
+ dependencies:
+ '@mapbox/node-pre-gyp': 1.0.9
+ acorn: 8.8.0
+ async-sema: 3.1.1
+ bindings: 1.5.0
+ estree-walker: 2.0.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ micromatch: 4.0.5
+ node-gyp-build: 4.5.0
+ resolve-from: 5.0.0
+ rollup-pluginutils: 2.8.2
+ transitivePeerDependencies:
+ - encoding
+ - supports-color
+ dev: true
+
/abab/2.0.6:
resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
dev: true
+ /abbrev/1.1.1:
+ resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
+ dev: true
+
/accepts/1.3.8:
resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
engines: {node: '>= 0.6'}
@@ -2128,6 +2427,14 @@ packages:
acorn: 7.4.1
dev: true
+ /acorn-jsx/5.3.2_acorn@8.8.0:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.8.0
+ dev: true
+
/acorn-node/1.8.2:
resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==}
dependencies:
@@ -2384,6 +2691,18 @@ packages:
- encoding
dev: false
+ /aproba/2.0.0:
+ resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
+ dev: true
+
+ /are-we-there-yet/2.0.0:
+ resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
+ engines: {node: '>=10'}
+ dependencies:
+ delegates: 1.0.0
+ readable-stream: 3.6.0
+ dev: true
+
/arg/4.1.3:
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
dev: true
@@ -2488,6 +2807,10 @@ packages:
retry: 0.13.1
dev: false
+ /async-sema/3.1.1:
+ resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==}
+ dev: true
+
/async/3.2.4:
resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==}
dev: true
@@ -2670,6 +2993,12 @@ packages:
engines: {node: '>=8'}
dev: true
+ /bindings/1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+ dependencies:
+ file-uri-to-path: 1.0.0
+ dev: true
+
/bl/4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
dependencies:
@@ -2948,6 +3277,11 @@ packages:
/chownr/1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
+ /chownr/2.0.0:
+ resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+ engines: {node: '>=10'}
+ dev: true
+
/chunkd/2.0.1:
resolution: {integrity: sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==}
dev: true
@@ -3083,6 +3417,11 @@ packages:
color-name: 1.1.4
simple-swizzle: 0.2.2
+ /color-support/1.1.3:
+ resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
+ hasBin: true
+ dev: true
+
/color/4.2.3:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
@@ -3136,6 +3475,10 @@ packages:
well-known-symbols: 2.0.0
dev: true
+ /console-control-strings/1.1.0:
+ resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
+ dev: true
+
/content-disposition/0.5.4:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
@@ -3247,6 +3590,11 @@ packages:
resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
dev: true
+ /data-uri-to-buffer/4.0.0:
+ resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==}
+ engines: {node: '>= 12'}
+ dev: false
+
/data-urls/2.0.0:
resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==}
engines: {node: '>=10'}
@@ -3369,6 +3717,10 @@ packages:
engines: {node: '>=0.4.0'}
dev: true
+ /delegates/1.0.0:
+ resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
+ dev: true
+
/depd/1.1.2:
resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
engines: {node: '>= 0.6'}
@@ -3644,7 +3996,6 @@ packages:
cpu: [x64]
os: [android]
requiresBuild: true
- dev: false
optional: true
/esbuild-android-arm64/0.13.15:
@@ -3679,7 +4030,6 @@ packages:
cpu: [arm64]
os: [android]
requiresBuild: true
- dev: false
optional: true
/esbuild-darwin-64/0.13.15:
@@ -3714,7 +4064,6 @@ packages:
cpu: [x64]
os: [darwin]
requiresBuild: true
- dev: false
optional: true
/esbuild-darwin-arm64/0.13.15:
@@ -3749,7 +4098,6 @@ packages:
cpu: [arm64]
os: [darwin]
requiresBuild: true
- dev: false
optional: true
/esbuild-freebsd-64/0.13.15:
@@ -3784,7 +4132,6 @@ packages:
cpu: [x64]
os: [freebsd]
requiresBuild: true
- dev: false
optional: true
/esbuild-freebsd-arm64/0.13.15:
@@ -3819,7 +4166,6 @@ packages:
cpu: [arm64]
os: [freebsd]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-32/0.13.15:
@@ -3854,7 +4200,6 @@ packages:
cpu: [ia32]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-64/0.13.15:
@@ -3889,7 +4234,6 @@ packages:
cpu: [x64]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-arm/0.13.15:
@@ -3924,7 +4268,6 @@ packages:
cpu: [arm]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-arm64/0.13.15:
@@ -3959,7 +4302,6 @@ packages:
cpu: [arm64]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-mips64le/0.13.15:
@@ -3994,7 +4336,6 @@ packages:
cpu: [mips64el]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-ppc64le/0.13.15:
@@ -4029,7 +4370,6 @@ packages:
cpu: [ppc64]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-riscv64/0.14.48:
@@ -4056,7 +4396,6 @@ packages:
cpu: [riscv64]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-linux-s390x/0.14.48:
@@ -4083,7 +4422,6 @@ packages:
cpu: [s390x]
os: [linux]
requiresBuild: true
- dev: false
optional: true
/esbuild-netbsd-64/0.13.15:
@@ -4118,7 +4456,6 @@ packages:
cpu: [x64]
os: [netbsd]
requiresBuild: true
- dev: false
optional: true
/esbuild-openbsd-64/0.13.15:
@@ -4153,7 +4490,6 @@ packages:
cpu: [x64]
os: [openbsd]
requiresBuild: true
- dev: false
optional: true
/esbuild-sunos-64/0.13.15:
@@ -4188,7 +4524,6 @@ packages:
cpu: [x64]
os: [sunos]
requiresBuild: true
- dev: false
optional: true
/esbuild-windows-32/0.13.15:
@@ -4223,7 +4558,6 @@ packages:
cpu: [ia32]
os: [win32]
requiresBuild: true
- dev: false
optional: true
/esbuild-windows-64/0.13.15:
@@ -4258,7 +4592,6 @@ packages:
cpu: [x64]
os: [win32]
requiresBuild: true
- dev: false
optional: true
/esbuild-windows-arm64/0.13.15:
@@ -4293,7 +4626,6 @@ packages:
cpu: [arm64]
os: [win32]
requiresBuild: true
- dev: false
optional: true
/esbuild/0.13.15:
@@ -4403,7 +4735,6 @@ packages:
esbuild-windows-32: 0.14.53
esbuild-windows-64: 0.14.53
esbuild-windows-arm64: 0.14.53
- dev: false
/escalade/3.1.1:
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
@@ -4479,6 +4810,15 @@ packages:
eslint: 7.32.0
dev: true
+ /eslint-config-prettier/8.5.0_eslint@8.21.0:
+ resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+ dependencies:
+ eslint: 8.21.0
+ dev: true
+
/eslint-import-resolver-node/0.3.6:
resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==}
dependencies:
@@ -4629,6 +4969,16 @@ packages:
svelte: 3.49.0
dev: true
+ /eslint-plugin-svelte3/4.0.0_a7wk4ghvg4hia4trwaglu7p6cq:
+ resolution: {integrity: sha512-OIx9lgaNzD02+MDFNLw0GEUbuovNcglg+wnd/UY0fbZmlQSz7GlQiQ1f+yX0XvC07XPcDOnFcichqI3xCwp71g==}
+ peerDependencies:
+ eslint: '>=8.0.0'
+ svelte: ^3.2.0
+ dependencies:
+ eslint: 8.21.0
+ svelte: 3.49.0
+ dev: true
+
/eslint-scope/5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
@@ -4637,6 +4987,14 @@ packages:
estraverse: 4.3.0
dev: true
+ /eslint-scope/7.1.1:
+ resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
/eslint-utils/2.1.0:
resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
engines: {node: '>=6'}
@@ -4654,6 +5012,16 @@ packages:
eslint-visitor-keys: 2.1.0
dev: true
+ /eslint-utils/3.0.0_eslint@8.21.0:
+ resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+ engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+ peerDependencies:
+ eslint: '>=5'
+ dependencies:
+ eslint: 8.21.0
+ eslint-visitor-keys: 2.1.0
+ dev: true
+
/eslint-visitor-keys/1.3.0:
resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
engines: {node: '>=4'}
@@ -4682,36 +5050,84 @@ packages:
cross-spawn: 7.0.3
debug: 4.3.4
doctrine: 3.0.0
- enquirer: 2.3.6
+ enquirer: 2.3.6
+ escape-string-regexp: 4.0.0
+ eslint-scope: 5.1.1
+ eslint-utils: 2.1.0
+ eslint-visitor-keys: 2.1.0
+ espree: 7.3.1
+ esquery: 1.4.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ functional-red-black-tree: 1.0.1
+ glob-parent: 5.1.2
+ globals: 13.15.0
+ ignore: 4.0.6
+ import-fresh: 3.3.0
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ js-yaml: 3.14.1
+ json-stable-stringify-without-jsonify: 1.0.1
+ levn: 0.4.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.1
+ progress: 2.0.3
+ regexpp: 3.2.0
+ semver: 7.3.7
+ strip-ansi: 6.0.1
+ strip-json-comments: 3.1.1
+ table: 6.8.0
+ text-table: 0.2.0
+ v8-compile-cache: 2.3.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint/8.21.0:
+ resolution: {integrity: sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint/eslintrc': 1.3.0
+ '@humanwhocodes/config-array': 0.10.4
+ '@humanwhocodes/gitignore-to-minimatch': 1.0.2
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
escape-string-regexp: 4.0.0
- eslint-scope: 5.1.1
- eslint-utils: 2.1.0
- eslint-visitor-keys: 2.1.0
- espree: 7.3.1
+ eslint-scope: 7.1.1
+ eslint-utils: 3.0.0_eslint@8.21.0
+ eslint-visitor-keys: 3.3.0
+ espree: 9.3.3
esquery: 1.4.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 6.0.1
+ find-up: 5.0.0
functional-red-black-tree: 1.0.1
- glob-parent: 5.1.2
+ glob-parent: 6.0.2
globals: 13.15.0
- ignore: 4.0.6
+ globby: 11.1.0
+ grapheme-splitter: 1.0.4
+ ignore: 5.2.0
import-fresh: 3.3.0
imurmurhash: 0.1.4
is-glob: 4.0.3
- js-yaml: 3.14.1
+ js-yaml: 4.1.0
json-stable-stringify-without-jsonify: 1.0.1
levn: 0.4.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.1
- progress: 2.0.3
regexpp: 3.2.0
- semver: 7.3.7
strip-ansi: 6.0.1
strip-json-comments: 3.1.1
- table: 6.8.0
text-table: 0.2.0
v8-compile-cache: 2.3.0
transitivePeerDependencies:
@@ -4734,6 +5150,15 @@ packages:
eslint-visitor-keys: 1.3.0
dev: true
+ /espree/9.3.3:
+ resolution: {integrity: sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.8.0
+ acorn-jsx: 5.3.2_acorn@8.8.0
+ eslint-visitor-keys: 3.3.0
+ dev: true
+
/esprima/4.0.1:
resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
engines: {node: '>=4'}
@@ -4763,6 +5188,10 @@ packages:
engines: {node: '>=4.0'}
dev: true
+ /estree-walker/0.6.1:
+ resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==}
+ dev: true
+
/estree-walker/1.0.1:
resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==}
dev: true
@@ -4983,6 +5412,14 @@ packages:
bser: 2.1.1
dev: true
+ /fetch-blob/3.2.0:
+ resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+ engines: {node: ^12.20 || >= 14.13}
+ dependencies:
+ node-domexception: 1.0.0
+ web-streams-polyfill: 3.2.1
+ dev: false
+
/figures/3.2.0:
resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
engines: {node: '>=8'}
@@ -5005,6 +5442,10 @@ packages:
flat-cache: 3.0.4
dev: true
+ /file-uri-to-path/1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+ dev: true
+
/filelist/1.0.4:
resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
dependencies:
@@ -5053,6 +5494,14 @@ packages:
path-exists: 4.0.0
dev: true
+ /find-up/5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
/find-up/6.3.0:
resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -5091,6 +5540,13 @@ packages:
engines: {node: '>=0.4.x'}
dev: false
+ /formdata-polyfill/4.0.10:
+ resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+ engines: {node: '>=12.20.0'}
+ dependencies:
+ fetch-blob: 3.2.0
+ dev: false
+
/forwarded/0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
@@ -5117,6 +5573,13 @@ packages:
universalify: 2.0.0
dev: true
+ /fs-minipass/2.1.0:
+ resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ minipass: 3.3.4
+ dev: true
+
/fs.realpath/1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: true
@@ -5154,6 +5617,21 @@ packages:
resolution: {integrity: sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==}
dev: true
+ /gauge/3.0.2:
+ resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ aproba: 2.0.0
+ color-support: 1.1.3
+ console-control-strings: 1.1.0
+ has-unicode: 2.0.1
+ object-assign: 4.1.1
+ signal-exit: 3.0.7
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wide-align: 1.1.5
+ dev: true
+
/gensync/1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
@@ -5209,7 +5687,7 @@ packages:
dev: true
/github-from-package/0.0.0:
- resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==}
+ resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=}
/github-slugger/1.4.0:
resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==}
@@ -5328,6 +5806,10 @@ packages:
tinygradient: 1.1.5
dev: false
+ /grapheme-splitter/1.0.4:
+ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
+ dev: true
+
/graphql-compose-json/6.2.0_graphql-compose@9.0.8:
resolution: {integrity: sha512-EfY6VPu6/Rah8xCEXa7WT1W/Hyd+wJZ08HFRDtEsZx3z/WRguDXDGi0kppGXWNQDc66PtEMfWvhDDsM/J8kiRQ==}
peerDependencies:
@@ -5418,6 +5900,10 @@ packages:
has-symbols: 1.0.3
dev: true
+ /has-unicode/2.0.1:
+ resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
+ dev: true
+
/has/1.0.3:
resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
engines: {node: '>= 0.4.0'}
@@ -5641,6 +6127,10 @@ packages:
engines: {node: '>= 4'}
dev: true
+ /immutable/4.1.0:
+ resolution: {integrity: sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==}
+ dev: true
+
/import-fresh/3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
@@ -6582,6 +7072,13 @@ packages:
p-locate: 4.1.0
dev: true
+ /locate-path/6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
/locate-path/7.1.1:
resolution: {integrity: sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -6594,7 +7091,7 @@ packages:
/lodash.deburr/4.1.0:
resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==}
- dev: false
+ dev: true
/lodash.merge/4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
@@ -7225,6 +7722,21 @@ packages:
/minimist/1.2.6:
resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
+ /minipass/3.3.4:
+ resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==}
+ engines: {node: '>=8'}
+ dependencies:
+ yallist: 4.0.0
+ dev: true
+
+ /minizlib/2.1.2:
+ resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+ engines: {node: '>= 8'}
+ dependencies:
+ minipass: 3.3.4
+ yallist: 4.0.0
+ dev: true
+
/mkdirp-classic/0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
@@ -7235,10 +7747,21 @@ packages:
minimist: 1.2.6
dev: true
+ /mkdirp/1.0.4:
+ resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dev: true
+
/mri/1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
+ /mrmime/1.0.1:
+ resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
+ engines: {node: '>=10'}
+ dev: true
+
/ms/2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
@@ -7276,6 +7799,12 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ /nanoid/4.0.0:
+ resolution: {integrity: sha512-IgBP8piMxe/gf73RTQx7hmnhwz0aaEXYakvqZyE302IXW3HyVNhdNGC+O2MwMAVhLEnvXlvKtGbtJf6wvHihCg==}
+ engines: {node: ^14 || ^16 || >=18}
+ hasBin: true
+ dev: false
+
/napi-build-utils/1.0.2:
resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==}
@@ -7346,6 +7875,11 @@ packages:
/node-addon-api/5.0.0:
resolution: {integrity: sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==}
+ /node-domexception/1.0.0:
+ resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+ engines: {node: '>=10.5.0'}
+ dev: false
+
/node-emoji/1.11.0:
resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
dependencies:
@@ -7362,6 +7896,14 @@ packages:
optional: true
dependencies:
whatwg-url: 5.0.0
+
+ /node-fetch/3.2.10:
+ resolution: {integrity: sha512-MhuzNwdURnZ1Cp4XTazr69K0BTizsBroX7Zx3UgDSVcZYKF/6p0CBe4EUb/hLqmzVhl0UpYfgRljQ4yxE+iCxA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ data-uri-to-buffer: 4.0.0
+ fetch-blob: 3.2.0
+ formdata-polyfill: 4.0.10
dev: false
/node-gyp-build/4.5.0:
@@ -7388,6 +7930,14 @@ packages:
engines: {node: '>=12.19'}
dev: true
+ /nopt/5.0.0:
+ resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dependencies:
+ abbrev: 1.1.1
+ dev: true
+
/normalize-path/3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
@@ -7418,6 +7968,15 @@ packages:
path-key: 3.1.1
dev: true
+ /npmlog/5.0.1:
+ resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
+ dependencies:
+ are-we-there-yet: 2.0.0
+ console-control-strings: 1.1.0
+ gauge: 3.0.2
+ set-blocking: 2.0.0
+ dev: true
+
/nth-check/2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
dependencies:
@@ -7635,6 +8194,13 @@ packages:
p-try: 2.2.0
dev: true
+ /p-limit/3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
/p-limit/4.0.0:
resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -7655,6 +8221,13 @@ packages:
p-limit: 2.3.0
dev: true
+ /p-locate/5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
/p-locate/6.0.0:
resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -7946,6 +8519,16 @@ packages:
svelte: 3.49.0
dev: true
+ /prettier-plugin-svelte/2.7.0_o3ioganyptcsrh6x4hnxvjkpqi:
+ resolution: {integrity: sha512-fQhhZICprZot2IqEyoiUYLTRdumULGRvw0o4dzl5jt0jfzVWdGqeYW27QTWAeXhoupEZJULmNoH3ueJwUWFLIA==}
+ peerDependencies:
+ prettier: ^1.16.4 || ^2.0.0
+ svelte: ^3.2.0
+ dependencies:
+ prettier: 2.7.1
+ svelte: 3.49.0
+ dev: true
+
/prettier/2.7.1:
resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==}
engines: {node: '>=10.13.0'}
@@ -8137,6 +8720,11 @@ packages:
functions-have-names: 1.2.3
dev: true
+ /regexparam/2.0.1:
+ resolution: {integrity: sha512-zRgSaYemnNYxUv+/5SeoHI0eJIgTL/A2pUtXUPLHQxUldagouJ9p+K6IbIZ/JiQuCEv2E2B1O11SjVQy3aMCkw==}
+ engines: {node: '>=8'}
+ dev: true
+
/regexpp/3.2.0:
resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
engines: {node: '>=8'}
@@ -8398,6 +8986,12 @@ packages:
glob: 7.2.3
dev: true
+ /rollup-pluginutils/2.8.2:
+ resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==}
+ dependencies:
+ estree-walker: 0.6.1
+ dev: true
+
/rollup/2.75.7:
resolution: {integrity: sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==}
engines: {node: '>=10.0.0'}
@@ -8466,6 +9060,16 @@ packages:
postcss: 8.4.14
dev: false
+ /sass/1.54.4:
+ resolution: {integrity: sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==}
+ engines: {node: '>=12.0.0'}
+ hasBin: true
+ dependencies:
+ chokidar: 3.5.3
+ immutable: 4.1.0
+ source-map-js: 1.0.2
+ dev: true
+
/saxes/5.0.1:
resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==}
engines: {node: '>=10'}
@@ -8553,6 +9157,14 @@ packages:
- supports-color
dev: false
+ /set-blocking/2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ dev: true
+
+ /set-cookie-parser/2.5.1:
+ resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==}
+ dev: true
+
/setprototypeof/1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
dev: false
@@ -8946,6 +9558,34 @@ packages:
- sugarss
dev: true
+ /svelte-check/2.8.0_sass@1.54.4+svelte@3.49.0:
+ resolution: {integrity: sha512-HRL66BxffMAZusqe5I5k26mRWQ+BobGd9Rxm3onh7ZVu0nTk8YTKJ9vu3LVPjUGLU9IX7zS+jmwPVhJYdXJ8vg==}
+ hasBin: true
+ peerDependencies:
+ svelte: ^3.24.0
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.14
+ chokidar: 3.5.3
+ fast-glob: 3.2.11
+ import-fresh: 3.3.0
+ picocolors: 1.0.0
+ sade: 1.8.1
+ svelte: 3.49.0
+ svelte-preprocess: 4.10.7_5pbfnpqyf7t5aldaahu6bz5wwm
+ typescript: 4.7.4
+ transitivePeerDependencies:
+ - '@babel/core'
+ - coffeescript
+ - less
+ - node-sass
+ - postcss
+ - postcss-load-config
+ - pug
+ - sass
+ - stylus
+ - sugarss
+ dev: true
+
/svelte-hmr/0.14.12_svelte@3.49.0:
resolution: {integrity: sha512-4QSW/VvXuqVcFZ+RhxiR8/newmwOCTlbYIezvkeN6302YFRE8cXy0naamHcjz8Y9Ce3ITTZtrHrIL0AGfyo61w==}
engines: {node: ^12.20 || ^14.13.1 || >= 16}
@@ -8955,6 +9595,58 @@ packages:
svelte: 3.49.0
dev: true
+ /svelte-preprocess/4.10.7_5pbfnpqyf7t5aldaahu6bz5wwm:
+ resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
+ engines: {node: '>= 9.11.2'}
+ requiresBuild: true
+ peerDependencies:
+ '@babel/core': ^7.10.2
+ coffeescript: ^2.5.1
+ less: ^3.11.3 || ^4.0.0
+ node-sass: '*'
+ postcss: ^7 || ^8
+ postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0
+ pug: ^3.0.0
+ sass: ^1.26.8
+ stylus: ^0.55.0
+ sugarss: ^2.0.0
+ svelte: ^3.23.0
+ typescript: ^3.9.5 || ^4.0.0
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ coffeescript:
+ optional: true
+ less:
+ optional: true
+ node-sass:
+ optional: true
+ postcss:
+ optional: true
+ postcss-load-config:
+ optional: true
+ pug:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ typescript:
+ optional: true
+ dependencies:
+ '@types/pug': 2.0.6
+ '@types/sass': 1.43.1
+ detect-indent: 6.1.0
+ magic-string: 0.25.9
+ sass: 1.54.4
+ sorcery: 0.10.0
+ strip-indent: 3.0.0
+ svelte: 3.49.0
+ typescript: 4.7.4
+ dev: true
+
/svelte-preprocess/4.10.7_bgntxiihuqhg5mwaa7nczjwpga:
resolution: {integrity: sha512-sNPBnqYD6FnmdBrUmBCaqS00RyCsCpj2BG58A1JBswNF7b0OKviwxqVrOL/CKyJrLSClrSeqQv5BXNg2RUbPOw==}
engines: {node: '>= 9.11.2'}
@@ -9032,7 +9724,6 @@ packages:
p-queue: 6.6.2
sharp: 0.30.7
string-replace-async: 2.0.0
- dev: true
/symbol-tree/3.2.4:
resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
@@ -9103,6 +9794,18 @@ packages:
inherits: 2.0.4
readable-stream: 3.6.0
+ /tar/6.1.11:
+ resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==}
+ engines: {node: '>= 10'}
+ dependencies:
+ chownr: 2.0.0
+ fs-minipass: 2.1.0
+ minipass: 3.3.4
+ minizlib: 2.1.2
+ mkdirp: 1.0.4
+ yallist: 4.0.0
+ dev: true
+
/temp-dir/2.0.0:
resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==}
engines: {node: '>=8'}
@@ -9246,7 +9949,6 @@ packages:
/tr46/0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
- dev: false
/tr46/1.0.1:
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
@@ -9723,6 +10425,34 @@ packages:
fsevents: 2.3.2
dev: true
+ /vite/3.0.4_sass@1.54.4:
+ resolution: {integrity: sha512-NU304nqnBeOx2MkQnskBQxVsa0pRAH5FphokTGmyy8M3oxbvw7qAXts2GORxs+h/2vKsD+osMhZ7An6yK6F1dA==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ hasBin: true
+ peerDependencies:
+ less: '*'
+ sass: '*'
+ stylus: '*'
+ terser: ^5.4.0
+ peerDependenciesMeta:
+ less:
+ optional: true
+ sass:
+ optional: true
+ stylus:
+ optional: true
+ terser:
+ optional: true
+ dependencies:
+ esbuild: 0.14.49
+ postcss: 8.4.14
+ resolve: 1.22.1
+ rollup: 2.75.7
+ sass: 1.54.4
+ optionalDependencies:
+ fsevents: 2.3.2
+ dev: true
+
/w3c-hr-time/1.0.2:
resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
dependencies:
@@ -9752,9 +10482,13 @@ packages:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
dev: false
+ /web-streams-polyfill/3.2.1:
+ resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
+ engines: {node: '>= 8'}
+ dev: false
+
/webidl-conversions/3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
- dev: false
/webidl-conversions/4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
@@ -9795,7 +10529,6 @@ packages:
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
- dev: false
/whatwg-url/7.1.0:
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
@@ -9832,11 +10565,25 @@ packages:
isexe: 2.0.0
dev: true
+ /wide-align/1.1.5:
+ resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
+ dependencies:
+ string-width: 4.2.3
+ dev: true
+
/word-wrap/1.2.3:
resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
engines: {node: '>=0.10.0'}
dev: true
+ /worktop/0.8.0-next.14:
+ resolution: {integrity: sha512-RZgqHu1w/JcUdWOE/BUEAzarrUUHh39eWkLdX8XpA6MfgLJF6X5Vl26CV7/wcm4O/UpZvHMGJUtB9eYTqDjc9g==}
+ engines: {node: '>=12'}
+ dependencies:
+ mrmime: 1.0.1
+ regexparam: 2.0.1
+ dev: true
+
/wrap-ansi/7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -9858,6 +10605,10 @@ packages:
/wrappy/1.0.2:
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ /wretch/1.7.10:
+ resolution: {integrity: sha512-UgF2o63bZRsz3LoOxaxzAUdFdlIJzVYbCHHhQ+LNMSBD1FeFJn8ADaekopJclHUm6sN8Lhu0DQFGQloliS0Twg==}
+ dev: false
+
/write-file-atomic/3.0.3:
resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
dependencies:
@@ -9946,6 +10697,11 @@ packages:
engines: {node: '>=6'}
dev: true
+ /yocto-queue/0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
/yocto-queue/1.0.0:
resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
engines: {node: '>=12.20'}
diff --git a/tsconfig.json b/tsconfig.json
index 2de15ee4..ed99ee0c 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -24,5 +24,9 @@
]
}
},
+ //https://github.com/avajs/ava/discussions/3036#discussioncomment-2928239
+ "ts-node": {
+ "transpileOnly": true
+ },
"exclude": ["**/dist/**", "**/node_modules/**"]
}