tldraw/packages/tlschema/scripts/new-asset.js
alex 71aef1764d
Rework the assets package for strategy-specific imports (#1341)
The assets package now only exports esm-formatted .js files. There's one
for each strategy - import-based, and meta.url-based. These are directly
generated as .js and .d.ts files rather than generated as .ts and
converted to js/dts through other means.

As this package depends on esm-specific stuff to function, we don't
publish a cjs version any more.

### Change Type

<!-- 💡 Indicate the type of change your pull request is. -->
<!-- 🤷‍♀️ If you're not sure, don't select anything -->
<!-- ✂️ Feel free to delete unselected options -->

<!-- To select one, put an x in the box: [x] -->

- [ ] `patch` — Bug Fix
- [ ] `minor` — New Feature
- [x] `major` — Breaking Change

- [ ] `dependencies` — Dependency Update (publishes a `patch` release,
for devDependencies use `internal`)

- [ ] `documentation` — Changes to the documentation only (will not
publish a new version)
- [ ] `tests` — Changes to any testing-related code only (will not
publish a new version)
- [ ] `internal` — Any other changes that don't affect the published
package (will not publish a new version)

### Release Notes

- [dev] If you're using the `@tldraw/assets` package, you need to update
your code to `import { getAssetUrlsByImport } from
'@tldraw/assets/imports'` instead of `import { getBundlerAssetUrls }
from '@tldraw/assets`
2023-05-09 16:08:38 +00:00

78 lines
2 KiB
JavaScript

// @ts-check
/* eslint-disable */
const kleur = require('kleur')
const fs = require('fs')
const path = require('path')
const typeName = process.argv[2]
const lowerAssetName = typeName[2].toLowerCase() + typeName.slice(3)
if (!typeName.match(/^TL[A-Z][a-z]+[a-zA-Z0-9]+Asset$/)) {
console.error(
kleur.red('ERROR: Type name must start with'),
`'${kleur.bold('TL')}'`,
kleur.red('and be in'),
kleur.bold('PascalCase'),
kleur.red('and end in'),
kleur.bold('Asset')
)
process.exit(1)
}
const recordsDir = path.join(__dirname, '..', 'src', 'assets')
if (!fs.existsSync(recordsDir)) {
console.error(kleur.red("ERROR: Can't find assets directory at path"), recordsDir)
process.exit(1)
}
const filePath = path.join(recordsDir, `${typeName}.ts`)
if (fs.existsSync(filePath)) {
console.error(kleur.red('ERROR: File already exists at path'), filePath)
process.exit(1)
}
const snakeCaseName =
typeName[2].toLowerCase() +
typeName
.slice(3, -5)
.replace(/[A-Z]/g, (match) => `_${match.toLowerCase()}`)
.trimStart()
fs.writeFileSync(
filePath,
`import { defineMigrations } from '@tldraw/tlstore'
import { TLAsset } from '../records/TLAsset'
declare module '../records/TLAsset' {
interface GlobalAssetPropsMap {
${snakeCaseName}: ${typeName}Props
}
}
// IMPORTANT: If you update this interface, you must also bump the version number and add a migration
export type ${typeName}Props = {}
export type ${typeName} = Extract<TLAsset, { type: '${snakeCaseName}' }>
// --- MIGRATIONS ---
// STEP 1: Add a new version number here, give it a meaningful name.
// It should be 1 higher than the current version
const Versions = {
Initial: 0,
} as const
export const ${lowerAssetName}Migrations = defineMigrations({
// STEP 2: Update the current version to point to your latest version
currentVersion: Versions.Initial,
firstVersion: Versions.Initial,
migrators: {
// STEP 3: Add an up+down migration for the new version here
},
})
`
)
console.log(kleur.green('Created new record type at path'), filePath)